• 设计模式-策略模式


    策略模式中一个类的行为可以在运行的时候进行更改,我们需要定义一个策略的接口,让所有的具体策略实现这个接口,然后封装一个可以执行策略的对象,可以通过传入不同的策略,执行不同的算法;

    1. 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
    2. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
    3. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
    4. 如何解决:将这些算法封装成一个一个的类,任意地替换。
    5. 关键代码:实现同一个接口。

    这里举例借鉴了《您的设计模式》中诸葛亮给赵云的锦囊妙计,让赵云去东吴的过程中拆开;

    下面看一下类图:

    实现策略模式的有以下几个步骤:

      • 定义一个策略接口
      • 让能够执行的具体策略实现这个接口
      • 封装一个可以执行策略的对象
      • 调用对应的策略

    1、定义一个策略接口

    package com.dongl.strategy;
    
    /**
     * 定义一个的策略
     */
    public interface Strategy {
    
        //每个锦囊妙计都是一个可执行的算法
        public void operate();
    }

    2、具体策略实现策略接口

    第一个策略:

    package com.dongl.strategy;
    
    public class BackDoor implements Strategy{
        @Override
        public void operate() {
            System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
        }
    }

    第二个策略:

    package com.dongl.strategy;
    
    public class BlockEnemy implements Strategy {
        @Override
        public void operate() {
            System.out.println("孙夫人断后,挡住追兵");
        }
    }

    第三个策略:

    package com.dongl.strategy;
    
    public class GivenGreenLight implements Strategy {
        @Override
        public void operate() {
            System.out.println("求吴国太开个绿灯,放行!");
        }
    }

    3、封装一个可以执行策略的

    package com.dongl.strategy;
    
    /**
     * 计谋有了,那还要有锦囊
     */
    public class Context {
        //构造函数,你要使用那个妙计
        private Strategy straegy;
        public Context(Strategy strategy){
            this.straegy = strategy;
        }
        //使用计谋了,看我出招了
        public void operate(){
            this.straegy.operate();
        }
    }

    4、调用对应策略

    package com.dongl.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("-----------刘备乐不思蜀了,拆第二个了-------------");
            context = new Context(new GivenGreenLight());
            context.operate(); //执行了第二个锦囊了
    
            System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
            context = new Context(new BlockEnemy());
            context.operate(); //孙夫人退兵
        }
    }
  • 相关阅读:
    bzoj1562: [NOI2009]变换序列
    bzoj2763: [JLOI2011]飞行路线
    有上下界网络流
    bzoj3211: 花神游历各国
    bzoj3668: [Noi2014]起床困难综合症
    bzoj2743: [HEOI2012]采花
    BZOJ 1787: [Ahoi2008]Meet 紧急集合
    BZOJ 1029 [JSOI2007]建筑抢修 贪心
    BZOJ 2748 音量调节
    BZOJ 3524: [Poi2014]Couriers 主席树
  • 原文地址:https://www.cnblogs.com/dongl961230/p/13306883.html
Copyright © 2020-2023  润新知