一、使用场景
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
策略模式:优点:统一所有的算法,行为,避免客户端再去些复杂的算法或行为
缺点:客户端必须知道所有的策略,并自行选择策略,也就是说必须知道算法,行为规则,根据自己去选择。
旅游为例子,可以做火车,飞机,骑自行车。
//公共接口
public interface ITravelStrategy {
void toTravel();
}
//具体策略
public class PlaneStrategy implements ITravelStrategy {
@Override
public void toTravel() {
System.out.println("坐飞机去旅游");
}
}
//具体策略
public class TrainStrategy implements ITravelStrategy {
@Override
public void toTravel() {
System.out.println("坐火车去旅游");
}
}
//具体策略
public class BicycleStrategy implements ITravelStrategy {
@Override
public void toTravel() {
System.out.println("骑自行车去旅游");
}
}
//旅行类
public class Traveler {
private ITravelStrategy iTravelStrategy;
public Traveler(ITravelStrategy iTravelStrategy) {
this.iTravelStrategy = iTravelStrategy;
}
public void travel() {
iTravelStrategy.toTravel();
}
}
//具体使用
// Traveler traveler = new Traveler(new BicycleStrategy());
// Traveler traveler = new Traveler(new TrainStrategy());
Traveler traveler = new Traveler(new PlaneStrategy());
traveler.travel();
是不是与简单工厂模式很像,那就来说一下吧;
二、与简单工厂对比
简单工厂模式: 根据客户选择的条件,来帮客户创建一个对象。
策略模式: 客户给它一个创建好的对象,它来帮客户做相应的事。
简单工厂模式的缺点就是当有新的需求增加时,需要频繁的修改工厂类。
只用策略模式,当有新的需求增加时需要修改的是客户端,客户端仍然承担着创建对象的职责,并没有减轻客户端的压力。
三、与简单工厂结合使用
//旅行类
public class Traveler {
private ITravelStrategy iTravelStrategy;
public Traveler(String strategyType) {
if ("plane".equals(strategyType)) {
iTravelStrategy = new PlaneStrategy();
} else if ("train".equals(strategyType)) {
iTravelStrategy = new TrainStrategy();
} else {
iTravelStrategy = new BicycleStrategy();
}
}
public void travel() {
iTravelStrategy.toTravel();
}
}
//使用
Traveler traveler = new Traveler("plane");
traveler.travel();
相对于策略模式,不用客户端再去创建对象了,保留了它去为客户端做事情。
相对与简单工厂,不会返回对象让客户端自己去做事情,保留了他为客户端创建对象的特点。
这个结合的理解感觉还是不到位,欢迎指正。