zoukankan      html  css  js  c++  java
  • 一天一个设计模式:策略模式

    概念:

      策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情况下变化。

    结构:

    环境(Context)角色:持有一个Strategy的引用。

    抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。

    具体策略(ConcreteStrategy)角色:包含具体场景的算法。

    代码示例:

    环境角色:

    public class Context {
        //持有一个具体策略的对象
        private Strategy strategy;
        /**
         * 构造函数,传入一个具体策略对象
         * @param strategy    具体策略对象
         */
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
        /**
         * 策略方法
         */
        public void contextInterface(){
            
            strategy.strategyInterface();
        }
        
    }
    View Code

    抽象策略类:

    public interface Strategy {
        /**
         * 策略方法
         */
        public void strategyInterface();
    }
    View Code

    具体策略类:

    public class ConcreteStrategyA implements Strategy {
    
        @Override
        public void strategyInterface() {
            //相关的业务
        }
    
    }
    
    //后面两个重复这个类
    View Code

    使用常见:

    我们以手抓饼订单为例,即有普通手抓饼,高级手抓饼,顶级手抓饼。

    场景就是接单类,根据具体的算法来生产不同的手抓饼订单。

    接单类:

    public class ReceiveOrder {
        private ShouzhuabingOrder shouzhuabingOrder;
    
        public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) {
            this.shouzhuabingOrder = shouzhuabingOrder;
        }
    
        //其实这我们可以对该函数进行一些功能强化,让其在算法选择的基础上进行一些功能的扩展
        //具体的可以参考java中Collections类下面的sort方法。
        //例如我们可以通过参数作为输入,相当于用户除了做定制化的手抓饼外,还可以再次基础上进行个性化的定制。
        public String makeOrder() {
            return shouzhuabingOrder.makeOrder();
        }
    }
    View Code

    手抓饼订单接口:

    public interface ShouzhuabingOrder {
    
        public String makeOrder();
    }
    View Code

    普通手抓饼:

    public class OriginOrder implements ShouzhuabingOrder {
        @Override
        public String makeOrder() {
            return "我是基础的手抓饼,只有一张饼,一个蛋还有各种酱";
        }
    }
    View Code

    高档手抓饼:

    public class MediumOrder implements ShouzhuabingOrder {
    
        @Override
        public String makeOrder() {
            return "我是一个中级手抓饼,自带一张饼,两个蛋,还有自制酱料";
        }
    }
    View Code

    豪华手抓饼:

    public class HighOrder implements ShouzhuabingOrder {
        @Override
        public String makeOrder() {
            return "我是高级手抓饼,我有一张饼,两个蛋,一个里脊,一个薄脆还有自制酱料。";
        }
    }
    View Code

    实际的接受订单的过程:

    public class Test {
        public static void main(String[] args) {
            HighOrder highOrder = new HighOrder();
    
            ReceiveOrder receiveOrder = new ReceiveOrder(highOrder);
    
            System.out.println(receiveOrder.makeOrder());
        }
    }
    View Code

    策略模式的核心:

      不管算法的实现,而是对算法做一个选择,组织,调用,从而使程序在结构上更加清晰,也更加方便维护和扩展。

    策略模式的平等性:

      算法的地位相同,可以相互替换,相互无依赖,策略模式中的算法关系未:相同行为的不同实现。

    策略模式运行时的唯一性:

      运行时,每一个时刻只能使用一个具体的策略实现对象,虽然可以动态切换,但是在同一时刻,只能是一个。

    共有行为:

      若所有算法均有具体的行为,可以将算法接口改成抽象类,同时共有的行为进行定义。

    策略模式的优点:

      1.策略模式提供了管理相关算法的算法族的方法,可以将部分共有代码移到父类,从而避免重复。

      2.使用策略模式,可以避免重复条件的判定(if-else)。

    策略模式的缺点:

      1.客户端必须知道所有的策略,并自行决定使用哪种策略,以便选用合适的算法。(我还没有想明白这点,这自行判断还不是要依赖if else)

      2.备选的策略多的话,类的数量会很多,不方便管理。

  • 相关阅读:
    MarkDown学习
    做网站的或者博客的网站
    Calendar日历简单用法
    Cron表达式范例
    CSVFileUtil 读取写入CSV文件简单工具类
    直接读取ZIP包数据 线上、线下方法
    Spring @Async/@Transactional 失效的原因及解决方案
    多线程学习 读写锁
    多线程学习 公平锁和非公平锁
    多线程学习 ThreadLocal的使用。
  • 原文地址:https://www.cnblogs.com/lilinzhiyu/p/9923688.html
Copyright © 2011-2022 走看看