• 设计模式之策略模式


      从字面上理解,策略即为对多种情况的选择,每种情况都代表一种策略。不同策略进行独立封装,互不影响,且可相互替换,由外部选择具体的策略,达到策略替换的目的。

    比如电商中对商品打折,可以打九折,可以减免运费,可以减免固定金额,这些分别表示不同的策略,最终根据不同的情况选择不同的折扣方式(策略),达到商品优惠的目的。

    或者出行,我们可以选择骑车、开车、飞机。。。

    下面列出策略模式的UML

    Strategy:策略的抽象类或接口

    StrategyA/StrategyB: 策略的具体实现

    Context:策略上下文,持有Strategy抽象,通过调用Strategy的方法,达到不同策略的切换

    下面我们使用策略模式来实现两个数的加减功能

    定义策略抽象

        public interface Strategy
        {
            int Operate(int num1,int num2);
        }

    定义具体策略实现相加、相减策略

       public class AddStrategy : Strategy
        {
            public int Operate(int num1, int num2)
            {
                return num1 + num2;
            }
        }
    
        public class SubtractStrategy : Strategy
        {
            public int Operate(int num1, int num2)
            {
                return num1 - num2;
            }
        }

    定义策略上下文

       public class StrategyContext
        {
            private Strategy _strategy;
    
            public StrategyContext(Strategy strategy)
            {
                _strategy = strategy;
            }
    
            public int Cal(int num1, int num2)
            {
                return _strategy.Operate(num1, num2);
            }
        }

    看客户端对策略的使用

       public class StrategyClient
        {
            public void Excute()
            {
                int num1 = 8;
                int num2 = 5;
                //相加策略
                Strategy strategy = new AddStrategy();
                var context = new StrategyContext(strategy);
                var result = context.Cal(num1, num2);            
            }
        }

    策略模式关注于对不同算法的封装,不会实现对具体策略的选择(由外部调用者选择),不同算法之间可以相互替换。从设计上满足了开闭原则,新增其它算法,只要添加

    新类就可以了,不会影响之前的实现。可以在客户端搭配工厂模式,动态创建不同策略,减少对客户端的修改。

  • 相关阅读:
    Ckeditor 编辑器上传WPS图片失败问题
    vue3 部署开发环境
    docker 容器报Permission denied问题
    阿里云二级域名解析+Nginx 反向代理,整洁URL
    Linux下安装PostgreSQL
    使用docker 安装 gitlab + jenkins + sonarqube
    Linux下安装Docker
    PL/SQL
    Linux下挖矿病毒解决记录
    Dubbo学习笔记-泛化实现进行mock
  • 原文地址:https://www.cnblogs.com/oneheart/p/9147562.html
Copyright © 2020-2023  润新知