zoukankan      html  css  js  c++  java
  • 【设计模式】1.策略模式

    策略模式

    策略模式(Strategy Design Pattern)定义了算法族,每个算法分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。

    结构图:

     

    Strategy负责提供实现策略所需的接口;

    ConcreteStrategy负责实现Strategy接口;

    Context保存ConcreteStrategy实例,使用它来调用接口方法;

    例:

    public interface PayStrategy {     // Strategy 接口(策略)
    
        void pay(BigDecimal money);
    
    }
    public class UseAliPay implements PayStrategy {  // Strategy 接口实现1(具体策略1)
    
        @Override
    
        public void pay(BigDecimal money) {
    
            System.out.println("use AliPay:" + money);
    
        }
    
    }
    public class UseWeChatPay implements PayStrategy {  // Strategy 接口实现2(具体策略2)
    
        @Override
    
        public void pay(BigDecimal money) {
    
            System.out.println("use WeChatPay:" + money);
    
        }
    
    }
    public class PayContext { // 策略上下文
    
        private BigDecimal money;
    
        private PayStrategy payStrategy;
    
        public PayContext(BigDecimal money, PayStrategy payStrategy) {
    
            this.money = money;
    
            this.payStrategy = payStrategy;
    
        }
    
        public void pay(){
    
            payStrategy.pay(money);
    
        }
    
    }
    public class Test { // 测试
    
        public static void main(String[] args){
    
            PayContext payContext;
    
            payContext = new PayContext(new BigDecimal(100),new UseAliPay());
    
            payContext.pay();
    
            payContext = new PayContext(new BigDecimal(200),new UseWeChatPay());
    
            payContext.pay();
    
        }
    
    }
    输出:
    use AliPay:100
    use WeChatPay:200

      策略PayStrategy 提供一个pay接口,具体策略UseAliPay和UseWeChatPay是该策略的实现(实现了pay接口),上下文PayContextpayStrategy包含一个PayStrategy作为成员变量和一个pay方法的参数money。根据具体的应用场景将对应的策略传入上下文实现相应算法。

      通过策略模式使策略的定义、创建和使用解耦,需要添加新的策略时对已有策略不会产生任何影响,代码的可维护性和可扩展性得到提高。

  • 相关阅读:
    没想到吧?这货比 open 更适合读取文件
    卸载 PyCharm!这才是 Python 小白的最理想的 IDE
    git 会保留所有的提交吗?不会!
    C# 在构造函数内调用虚方法
    【转】第一个汇编器是怎么实现的
    SQL Server查询数据库所有表名与表说明
    Vue实现节流,防止重复提交
    mysql 查询json数组(一)
    VScode怎么在代码折叠后,插入新的内容
    Vue 通过调用百度API获取地理位置-经度纬度省份城市
  • 原文地址:https://www.cnblogs.com/jiazhongxin/p/12785463.html
Copyright © 2011-2022 走看看