设计模式之策略模式01
背景
举例说明策略模式
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,还真是解决了大问题,摘到最后赔了夫人又折兵,那我们先看下场景有是什么样子的。
分析
先说下场景中的要素:三个锦囊,一个赵云,妙计是小亮同志给的,妙计是安放在锦囊中的,俗称锦囊妙计,赵云是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用Java画出类图如下
实现
三个妙计是同一类型的东东。写个接口
public interface IStrategy {
//每个锦囊都是一个可执行的算法
public void operate();
}
然后再写三个妙计
public class BackDoor implements IStrategy{
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
public class GiveGreenLight implements IStrategy{
public void operate() {
System.out.println("求吴国太开个绿灯,放行");
}
}
public class BlockEnemy implements IStrategy{
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
三个妙计有了,需要地方来放置这些妙计,锦囊如下
public class Context {
private IStrategy strategy;
//构造要使用的妙计
public Context (IStrategy strategy) {
this.strategy = strategy;
}
//使用妙计,获得胜利
public void operate() {
this.strategy.operate();
}
}
然后就是赵云拿着三个锦囊给刘老爷子办事。
public class Zhaoyun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
* @param args
*/
public static void main(String[] args) {
Context context;
System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
context = new Context(new BackDoor());
//拿到妙计
context.operate();
//拆开执行
System.out.println("\n\n");
System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
context = new Context(new GiveGreenLight());
//拿到妙计
context.operate();
//拆开执行
System.out.println("\n\n");
System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
context = new Context(new BlockEnemy());
//拿到妙计
context.operate();
//拆开执行
System.out.println("\n\n");
}
}
就这三招搞得周郎赔了夫人又折兵,这就是策略模式。高内聚低耦合的特点就表现出来了,还有一个就是扩展性,也就是OCP原则,策略类可以一直加下去,只要修改Context.java就好了。
github代码: