美文网首页设计模式
设计模式之禅笔记-策略模式

设计模式之禅笔记-策略模式

作者: 凉快先生 | 来源:发表于2020-12-20 10:58 被阅读0次

    赵云跟着刘备去江东,诸葛亮给了赵云三个锦囊。

    1.抽象策略接口

    public interface IStrategy {

    // 每个锦囊妙计都是一个可执行的算法

    public void operate();

    }

    2.实现策略接口,三个具体策略

    找乔国老帮忙,使孙权不能杀刘备

    public class BackDoor implements IStrategy {

      public void operate() {

      System.out.println("找乔国老帮忙,让吴国太给孙权施加压力" ); }

      }

    求吴国太开个绿灯

    public class GivenGreenLight implements IStrategy {

    public void operate() {

      System.out.println("求吴国太开个绿灯,放行!" );

    }

      }

    孙夫人断后,挡住追兵

    public class BlockEnemy implements IStrategy {

      public void operate() {

      System.out.println("孙夫人断后,挡住追兵" );

      }

      }

    3.设计统一调用策略的路径(锦囊)

    public class Context {

    // 构造函数,你要使用那个妙计

    private IStrategy straegy ;

    public Context(IStrategy strategy){

    this.straegy = strategy;

    }

    // 使用计谋了,看我出招了

    public void operate(){

    this.straegy .operate();

    }

    }

    4.赵云调用锦囊使用具体策略

    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" );

      // 刘备乐不思蜀了,拆第二个了

      System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------" );

      context = new Context(new GivenGreenLight());

      context.operate(); // 执行了第二个锦囊了

      System.out.println("\n\n\n\n\n\n\n\n" );

      // 孙权的小兵追了,咋办?拆第三个

      System.out.println("----------- 孙权的小兵追了,咋办?拆第三个

      -------------" );

      context = new Context(new BlockEnemy());

      context.operate(); // 孙夫人退兵

      System.out.println("\n\n\n\n\n\n\n\n" );

    }

    }

    策略模式体现了高内聚低耦合的特性,可扩展性,ocp原则(开闭原则),策略可无限加,只需改变context即可。

    相关文章

      网友评论

        本文标题:设计模式之禅笔记-策略模式

        本文链接:https://www.haomeiwen.com/subject/ufzhnktx.html