策略模式
介绍
1.在策略模式中,一个行为或其算法可以在运行时更改,这种类型的设计模式属于策略模式。
2.在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的choose对象,策略对象改变choose对象的执行算法。
优点
1.可以动态的改变对象的行为。
2.避免使用多重条件判断。
3.扩展性好。
缺点
1.多有的策略类都要对外暴露。
2.策略越多,类就越多。
应用场景
1.如果一个系统里面有许多类,他们之间的区别在于他们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。
2.一个系统需要动态的在几种算法中选择一种。
3.如果一个对象有很多行为需要使用多重条件选择语句来实现。
组成结构
实现代码
背景
git想要出去旅游,于是用策略模式制定了一个出行方案。
步骤一
创建一个策略接口,里面有一个出行方式的方法。
/**
* 每个策略都是一个可执行的算法,
* 可根据业务定制不同的算法类实现该接口
*/
public interface Strategy {
public String travelWay();
}
步骤二
创建策略的具体实现类,把每种出行方式都封装到类中。
/**
* 飞机出行
*/
public class PlaneStrategy implements Strategy {
@Override
public String travelWay() {
return "乘坐飞机出行";
}
}
/**
* 火车出行
*/
public class TrainStrategy implements Strategy {
@Override
public String travelWay() {
return "乘坐火车出行";
}
}
/**
* 汽车出行
*/
public class CarStrategy implements Strategy {
@Override
public String travelWay() {
return "乘坐汽车出行";
}
}
步骤三
创建策略运行环境,相当于策略选择器类,持有一个策略接口的引用。
/**
* 此类相当于策略动态选择器
*/
public class Choose {
private Strategy strategy;
//构造函数放入要使用的策略
public Choose(Strategy strategy) {
this.strategy = strategy;
}
public String travelWay() {
return strategy.travelWay();
}
}
步骤四
创建demo运行
public class StrategyPatternDemo {
public static void main(String[] args) {
System.out.println("有一天git想要出去旅游,于是他制定了一个路线");
Choose
planStrategy = new Choose(new PlaneStrategy()),
trainStrategy = new Choose(new TrainStrategy()),
carStrategy = new Choose(new CarStrategy());
System.out.println("他打算先" + planStrategy.travelWay() + "先到上海游玩");
System.out.println("然后在"+trainStrategy.travelWay()+"到杭州");
System.out.println("最后在"+carStrategy.travelWay()+"到宾馆");
}
}