策略模式
策略模式专注于对象行为。
UML 示例
组成
- 抽象策略角色
- 具体策略角色
- 环境角色
下面,结合UML示例图,并以乘坐交通工具去大理为例,解释下策略模式的组成部分。
抽象策略角色
策略类,通常由一个接口或者抽象类实现。通常,策略类中会定义一些动作/行为
,但是并不关注这些动作/行为
怎么实现。
按照上面的例子,TrafficTool就是策略类,该类种只定义了goDali
方法。但是并没有实现该方法。
/**
* 交通工具
*/
public abstract class TrafficTool{
public void goDali();
}
具体策略角色
具体策略类,是策略类的具体实现,通常会继承或者实现策略类。
按照上面的例子,高铁、飞机、汽车3个子类就是我们所说的具体策略角色,它们都实现了策略类中所定义的行为/动作,即它们都实现了去大理的过程。示例代码如下:
/**
* 飞机
*/
public class Plane extends TrafficTool{
public void goDali(){
//购买机票
buyPlaneTicket();
...
}
}
/**
* 高铁
*/
public class HighSpeedRail extends TrafficTool{
public void goDali(){
//购买火车票
buyRailTicket();
...
}
}
/**
* 汽车-自驾
*/
public class car extends TrafficTool{
public void goDali(){
//检查汽油是否足够
checkOil();
...
}
}
环境角色
环境角色中持有一个策略类的引用,给需要的调用者调用。
按照上面的的例子,环境类中就是Person类,Person类有一个私有属性trafficTool
,trafficTool
即是我们所说的策略类(TrafficTool
类)的引用。环境角色代码如下:
public class Person{
private TrafficTool trafficTool;
Person(TrafficTool trafficTool){
this.trafficTool = trafficTool;
}
...
}
环境角色调用者
作为环境角色调用者,我们需要指明乘坐哪种交通工具去大理,而非由策略类或者环境类决定。示例代码如下:
//乘坐高铁去大理
Person person = new Person(new HighSpeedRail());
person.getTrafficTool().goDali();