您的位置:首页 > 编程语言 > Java开发

Java开发之设计模式--策略模式(Strategy Pattern)

2015-06-19 15:17 609 查看

模拟场景:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。

先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。

类图



Java程序

三个妙计是同一类型,那咱就写个接口:

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 *
*/

public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法
public void operate();
}


三个妙计,三个实现类:

1.

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
* 找乔国老帮忙,使孙权不能杀刘备
*/

public class BackBoor implements IStrategy {
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}


2.

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
* 求吴国太开个绿灯
*/

public class GivenGreenLight implements IStrategy {
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}


3.

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
* 孙夫人断后,挡住追兵
*/

public class BlockEnemy implements IStrategy {
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}


三个妙计入锦囊:

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
* 计谋有了,那还要有锦囊
*/

public class Context {
//构造函数,你要使用哪个妙计
private IStrategy strategy;
public Context(IStrategy strategy){
this.strategy = strategy;
}

//使用计谋了,看我出招了
public void operate(){
this.strategy.operate();
}
}


然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:

赵云出场,一个顶俩:

package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all.
*/

public class ZhaoYun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
*/
public static void main(String[] args) {
Context context;

//刚刚到吴国的时候,拆第一个
context = new Context(new BackDoor()); //拿到妙计
context.operate(); //拆开执行

//刘备乐不思蜀了,拆第二个
context = new Context(new GivenGreenLight());
context.operate(); //执行了第二个锦囊了

//孙权的小兵追了,咋办?拆第三个
context = new Context(new BlockEnemy());
context.operate(); //孙夫人退兵
}
}


策略模式优点:

算法的使用和算法本身解耦,即把变化的具体算法封装了起来。策略模式是除了继承之外的一种弹性替代方案,如果你使用继承定义了一个类,下面有部分的派生类,此时你会让基类所困住,要想修改它特别不容易,而策略模式则可能通过组合不同的对象来改变行为。

策略模式缺点:

1、 虽说客户代码无须关心各个策略是如何实现的,但是它们还是要知道有多少种策略实现,具体功能情况,这样才可以根据需要使用哪个策略。

2、 使用策略模式后出现很多小类。

就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了, 还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下去,只要修改 Context.java 就可以了,这 个不多说了,自己领会吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息