设计模式-策略模式
策略模式使用的就是面向对象的继承和多态机制,非常容易理解,策略模式的三个角色分别为:
Context封装角色
它也叫上下文角色,起承上启下的封装作用,屏蔽高层模块或者服务对策略、算法的直接访问,封装可能存在变化。
Strategy抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或方法必须具有的方法和属性。
ConcreteStrategy具体策略模式
实现抽象策略中的操作,该类含有具体的业务逻辑。
我们在看看策略模式的通用源码,先看抽象策略角色,它是非常普通的一个接口类。
public interface Strategy{
//策略模式的接口方法
public void doSomething();
}
具体策略模式也是一个非常普通的实现类,只需要实现接口中的方法即可。
public class ShoppingStrategy implements Strategy{
//购物的策略是做什么
public void doSomething(){
System.out.println("购物的策略");
}
}
public class MoviesStrategy implements Strategy{
//看电影的策略做什么
public void doSomething(){
System.out.println("看电影策略");
}
}
策略模式的重点就是封装角色,它是借用了代理模式的思路。策略模式和代理模式的差别在于:策略模式的封装角色和被封装的策略类不用是同一个方法,如果是同一个方法那就是代码模式。
public class Context{
//抽象策略
private Strategy strategy = null;
//构造函数设置具体策略
public Context(Strategy strategy){
this.strategy = strategy;
}
//封装后的策略方法
public void doAnything(){
this.strategy.doSomething();
}
}
高层服务和模块的调用非常简单,知道要用那个策略,生产出它的对象,然后放到封装角色中完成任务就可以了
public class ItDog{
public static void main(String[] args){
//声明一个具体的策略
Strategy strategy = new ShoppingStrategy();
//声明上下文对象
Context context = new Context(strategy);
//执行封装后的方法
context.doAngthing();
}
}
策略模式就是这么简单,它采用了面向对象的继承和多态。