Java设计模式系列之策略模式

策略模式定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

比如:

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

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?

那我们先来看看图

image

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

package com.yangguangfu.strategy;
/**
 * 
 * @author trygf521@126.com:阿福
 * 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。
 */
public interface IStrategy {
    //每个锦囊妙计都是一个可执行的算法。
    public void operate();

}

然后再写三个实现类,有三个妙计嘛:

妙计一:初到吴国:

package com.yangguangfu.strategy;
/**
 * 
 * @author trygf521@126.com:阿福
 * 找乔国老帮忙,使孙权不能杀刘备。
 */
public class BackDoor implements IStrategy {

    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
    }

}

妙计二:求吴国太开个绿灯,放行:

package com.yangguangfu.strategy;
/**
 * 
 * @author trygf521@126.com:阿福
 * 求吴国太开个绿灯。
 */
public class GivenGreenLight implements IStrategy {

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

}

妙计三:孙夫人断后,挡住追兵:

package com.yangguangfu.strategy;
/**
 * 
 * @author trygf521@126.com:阿福
 * 孙夫人断后,挡住追兵。
 */
public class BlackEnemy implements IStrategy {

    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵...");

    }

}
好了,大家看看,三个妙计是有了,那需要有个地方放妙计啊,放锦囊里:
package com.yangguangfu.strategy;
/**
 * 
 * @author trygf521@126.com:阿福
 *
 */
public class Context {
    
    private IStrategy strategy;
    //构造函数,要你使用哪个妙计
    public Context(IStrategy strategy){
        this.strategy = strategy;
    }
    
    public void operate(){
        this.strategy.operate();
    }

}
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列,还想着娶纯情少女的,色咪咪的刘备老爷子去入赘了,嗨,还别说,亮哥的三个妙计还真不错,瞧瞧:
package com.yangguangfu.strategy;

public class ZhaoYun {

    /**
     * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
     */
    public static void main(String[] args) {
        Context context;
        
        //刚到吴国的时候拆开第一个
        System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
        context = new Context(new BackDoor());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
        
        //当刘备乐不思蜀时,拆开第二个
        System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
        context = new Context(new GivenGreenLight());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
        
        //孙权的小追兵了,咋办?拆开第三个锦囊
        System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
        context = new Context(new BlackEnemy());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

}
image
imageimage
posted @ 2014-11-11 16:12  韩慧兵  阅读(137)  评论(0编辑  收藏  举报