概述
所谓策略,指的是一个类的行为或其算法可以在运行时更改.
就像出行选择的交通工具,要根据自己的情况,可以自由切换自行车,汽车,火车等等.
三个角色
环境Context 持有策略strategy的引用,通过引用来调用某ConcreteStrategy定义的算法。
抽象策略Strategy 定义所有支持的算法的公共接口
具体策略ConcreteStrategy 实现的策略类
类图
代码实现
1.抽象策略接口
public interface Strategy {
public void travel();
}
具体策略的实现
public class BikeStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by bike");
}
}
public class BusStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by Bus");
}
}
public class CarStrategy implements Strategy{
@Override
public void travel() {
// TODO Auto-generated method stub
System.out.println("we can travel by Car");
}
}
3.策略持有者和执行者
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void executeStrategy(){
strategy.travel();
}
}
4.测试
public class Test {
/**
* 构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略
* @param args
*/
public static void main(String[] args) {
System.out.println("===========我选择策略一==========");
Strategy strategy=new CarStrategy();
Context context =new Context(strategy);
context.executeStrategy();
System.out.println("===========我选择策略二==========");
Strategy strategy1=new BikeStrategy();
Context context1 =new Context(strategy1);
context1.executeStrategy();
System.out.println("===========我选择策略三==========");
Strategy strategy3=new BusStrategy();
Context context3 =new Context(strategy3);
context3.executeStrategy();
}
}
5.测试结果
===========我选择策略一==========
we can travel by Car
===========我选择策略二==========
we can travel by bike
===========我选择策略三==========
we can travel by Bus
总结
写法类似于状态模式,但思想却不像状态模式.
策略模式注重于,采用何种策略,去解决问题.策略构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略
状态模式则注重于,切换状态,以及优雅的切换状态中的动作.状态构建的过程放在Context中,客户端只需要执行不同的动作即可.
但是话又说回来,’if else’可以用策略模式和状态模式代替
其实这都使用了面向对象的多态的特性==>子类的对象可以指向父类的引用,允许不同类的对象对同一消息作出响应.