• 浅析Java设计模式【3.4】——策略



    title: 浅析Java设计模式【3.4】——策略
    date: 2018-12-29 17:26:17
    categories: 设计模式
    description: 浅析Java设计模式【3.4】——策略

    1. 目录

    Celue-1

    2. 概念

    策略的设计模式属于行为型模式一种,通过定义的一套算法类,进行封装,让算法类之间可以相互替换,从而达到一种按照调用侧/实现侧去决定目标实现。策略模式可以最大程度的避免代码中 if else 以及 switch 语句。

    2.1. 应用场景

    • 在需要多实现场景下,但只在算法或行为上略有差异
    • 在算法或行为上须自由完成切换
    • 需要解脱或者屏蔽多条件判断的场景

    2.2. 优缺点

    2.2.1. 优点
    • 算法或行为可自由切换
    • 避免在实现过程中,使用多重条件判断
    • 实现结构上具备扩展性良好和可读性
    2.2.2. 缺点
    • 策略的基础条件随着业务增长会增多,可能存在臃肿
    • 不是很安全,因为所有的策略条件都对外暴露

    3. 模式结构

    策略模式 的实现包含三个组成部分,分别为 策略类具体策略类上下文

    • Strategy:策略类,用于定义所有支持算法的公共接口;
    • ConcreteStrategy:是具体策略类,封装了具体的算法或行为,继承于 Strategy
    • Context:是上下文,用一个 ConcreteStrategy 来配置,维护一个对 Strategy 对象的引用

    STRATEGY

    4. 样例

    此处假定我们在商场购物,用户支付的环节,在用户支付过程中,我们可以选择 现金信用卡积分

    4.1. 定义策略

    
    public interface Payment {
    
        void payment();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2. 定义具体策略

    • 现金
    
    public class Cash implements Payment{
    
        @Override
        public void payment() {
            System.out.println("现金付款");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 信用卡
    
    public class Credit implements Payment{
    
        @Override
        public void payment() {
            System.out.println("信用卡付款");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 积分
    
    public class Points implements Payment{
    
        @Override
        public void payment() {
            System.out.println("积分付款");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.3. 定义上下文

    public class Shopping {
    
        private Payment payment;
    
        public Shopping(Payment payment) {
            this.payment = payment;
        }
    
        public void buyDesktop(){
            System.out.println("购买台式机");
            payment.payment();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.4. 实现效果

    
    @DisplayName("策略应用")
    @Test
    public void testStrategy() {
        Payment payment = new Cash();
        Shopping shopping = new Shopping(payment);
        shopping.buyDesktop();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    20220830152421

  • 相关阅读:
    Redis数据结构的奇妙世界:一窥底层存储机制【redis第一部分】
    拉链表-spark版本
    minio集群部署(k8s内)
    12. JVM内存管理的深度剖析
    python及编程范式
    leetCode 647.回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针
    MindFusion Crack版,以围绕根的同心圆排列层
    slim.max_pool2d()
    怎么用postman连接websocket
    动手实现深度学习(5):计算图的实现
  • 原文地址:https://blog.csdn.net/rothchil/article/details/126605158