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);            
            }
        }

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

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

  • 相关阅读:
    Linux 进程终止后自动重启
    (转) Android中ViewStub组件使用
    (转)android UI进阶之用ViewPager实现欢迎引导页面
    (转)android UI进阶之实现listview的分页加载
    (转)android UI进阶之实现listview的下拉加载
    (转)android UI进阶之弹窗的使用(2)实现通讯录的弹窗效果
    学习网址
    (转)android UI进阶之实现listview中checkbox的多选与记录
    (转)android UI进阶之自定义组合控件
    (转)Android里merge和include标签的使用
  • 原文地址:https://www.cnblogs.com/oneheart/p/9147562.html
Copyright © 2011-2022 走看看