一 策略模式 来自CBF4LIFE 的设计模式


刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,
嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子
的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊
里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序
怎么表现这个呢?我们先看类图:
 

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

package Strategy_pattern;

/**
 * @author lhb
 * @类名 Istrategy
 * @描述 策略接口 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口 
 * @时间 2022/4/25 13:43
 * @版本
 **/
public interface Istrategy {
    /**
     * 每个策略执行一个方法
     */
    public void operate();
}

妙计三

package Strategy_pattern;

/**
 * @author lhb
 * @类名 ThreeStrtegy
 * @描述  孙夫人断后,挡住追兵
 * @时间 2022/4/25 13:47
 * @版本
 **/
public class ThreeStrtegy implements Istrategy{
    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}

妙计二

package Strategy_pattern;

/**
 * @author lhb
 * @类名 secondStrategy
 * @描述  求吴国太开个绿灯
 * @时间 2022/4/25 13:46
 * @版本
 **/
public class secondStrategy implements Istrategy{
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");
    }
}

妙计一

package Strategy_pattern;

/**
 * @author lhb
 * @类名 FristStrategy
 * @描述 找乔国老帮忙,使孙权不能杀刘备
 * @时间 2022/4/25 13:45
 * @版本
 **/
public class FristStrategy implements  Istrategy{
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}

好了,大家看看,三个妙计是有了,那需要有个地方放这些妙计呀,放锦囊呀: 

package Strategy_pattern;
/**
 * @author lhb
 * @类名 Context
 * @描述  计谋有了,那还要有锦囊
 * @时间 2022/4/25 13:58
 * @版本
 **/
public class Context {
    private Istrategy strategy;

    /**
     * 构造函数,你要使用那个妙计
     * @param strategy
     */
    public Context(Istrategy strategy){
        this.strategy = strategy;
    }
    /**
     *  使用计谋了,看我出招了
     */

    public void operator(){
        this.strategy.operate();
    }
}

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

package Strategy_pattern;

/**
 * @author lhb
 * @类名 ZhaoYunMain
 * @描述  赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
 * @时间 2022/4/25 14:10
 * @版本
 **/

public class ZhaoYunMain {
    public static void main(String[] args) {
        System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
        //才开执行
        new Context(new FristStrategy()).operator();

        System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
        new Context(new secondStrategy()).operator();
        //孙权的小兵追了,咋办?拆第三个
        System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
        new Context(new ThreeStrtegy()).operator();

        System.out.println("-----------最后周瑜配了夫人又折兵!!! -------------");
    }
}

 策略模式的好处就是:体现了高内聚低耦合的特性呀,缺点嘛,每一种策略都需要封装成一个类,可能会存在较多的策略类。 这也不叫缺点吧.

应用场景:  游戏在不同的场景或者策略下释放不同的技能.

就这三招,搞的周郎是“陪了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,
还有一个就是扩展性,也就是 OCP 原则,策略类可以继续增加下,这
个不多说了,自己领会吧。