按照老习惯,学习设计模式的时候先别管具体的类图啊,操作啊什么的。咱就先看着名字,想想这可能是个什么东西。
策略,策略,啥叫策略?达到目的所采用的不同手段,就叫策略。从城市A到城市B去,可以走过去,可以坐汽车,坐火车,坐飞机,做轮船,这些都叫策略。
城市A到城市B是目的,交通工具的选择是策略。策略具有可替换性,只是职责中的一环。先瞅瞅,代码中如何实现刚才所说的情况:
Class Travel{
private Vehicle vehicle;
public setVehicle();
public getResult(){
//假定有内置两个城市之间的距离totalDistance,
//通过不同的策略就可以获取花费的时间了
return totalDistance/vehicle.getSpeed();;
}
}
Class Vehicle{
getSpeed();
}
Class Car extend Vehicle{
getSpeed();
}
Class Train extend Vehicle{
getSpeed();
}
//客户端来使用
String type;
Travel travle = new Travel();
switch(type){
case "car":
travle.setVehicle();
break;
case "Train":
travle.setVehicle();
break;
}
travle.getResult();
承担核心职责的类,只持有抽象的策略,具体的策略在使用的过场中进行替换。再看看其类图
策略类的作用只是为核心类产生一个中间的结果,具体的使用交给核心类。
仔细看这个类图,你会发现跟简单工厂模式非常的像,只是两边类的关系由依赖变成了聚合或者组合,把耦合度增加了。为什么会出现这种稍微改变一点点就成了一个新的设计模式呢?
想想简单工厂模式,它的目的是隐藏产品的生产(简化类的创建),不需要持有真正的产品,相当于给产品类加了个壳,工厂类反而不是真正需要使用的,真正的核心是产品类(有谁关心工厂怎么样么?大家肯定都只关心产品怎么样,有什么功能)。而看策略模式呢,策略类只是提供了一种选择,帮助核心类更好的达成目的,策略是核心类的一部分,所以他们的耦合度要搞,策略一般以成员变量的方式出现。
其实这里有个很好的东西!回想下简单工厂模式的作用,用来生产一系列具有类似功能的产品,在标准的简单工厂模式中,是通过对象多态的方式来呈现不同的产品的职责差异。难道就只有这一种方式来表示具有不同功能的产品吗?不是的,策略模式下虽然产品还是一个,但是根据策略的不同 其等价于不同功能的产品。那么这两种设计模式就有结合的可能了,看看代码如下:
Class Travel{
private Vehicle vehicle;
public setVehicle();
public getResult(){
//假定有内置两个城市之间的距离totalDistance,
//通过不同的策略就可以获取花费的时间了
return totalDistance/vehicle.getSpeed();;
}
}
Class TravelFactory{
Travel createTravel(type){
Travel travle = new Travel();
switch(type){
case "car":
travle.setVehicle();
break;
case "Train":
travle.setVehicle();
break;
}
}
Class Vehicle{
getSpeed();
}
Class Car extend Vehicle{
getSpeed();
}
Class Train extend Vehicle{
getSpeed();
}
//客户端来使用
String type;
Travel travle = TravelFactory.createTravel(type);
travle.getResult();