zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

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

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

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

    下面列出策略模式的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);            
            }
        }

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

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

  • 相关阅读:
    CircleImageView 圆形图片头像实现
    使用VisualStudio开发php的图文设置方法[xyytit]
    使用VisualSVN Server搭建SVN服务器[xyytit]
    比较全的JavaScript倒计时脚本[xyytit]
    jQuery对象转换为DOM对象(转)
    SQL Server多条件查询的实现
    GridView控件中的一些常见问题
    GridView中如何实现自定义时间货币等字符串格式?
    js关闭当前页面(窗口)的几种方式总结(转)
    Sql求和异常——对象不能从 DBNull 转换为其他类型
  • 原文地址:https://www.cnblogs.com/oneheart/p/9147562.html
Copyright © 2011-2022 走看看