zoukankan      html  css  js  c++  java
  • 如何使用策略模式

    什么时候能用到策略模式呢?

    比如说 你之前代码中肯定或多或少的用到条件判断语句 Switch case和 If else语句,如果使用策略类就可以解开耦合,同时也使维护性和系统的可扩展性大大的增强。

    下面举个例子:

    如下图代码所示,ClientCode类会增加枚举City的值来调用Travel的不同方法,但是这样做的话会产生很多的判断语句,今天用于测试只列举三个,但在项目中我也看到过十多个,类就会变得很大,维护中改动也会变得很大,要是每次更改一个地方,都要对整个结构进行编译,维护起来比较麻烦。遇到这样的情况,我们就要对它进行重构,剥开耦合。

    using System.Windows;
    
    namespace StrategyPatternTest
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                MessageBox.Show(new ClientCode().IsTravelToCity().ToString());
            }
        }
    
        public enum City
        {
            Bejing,
            Shanghai,
            Suzhou
        }
    
        public  class ClientCode
        {
            public bool IsTravelToCity()
            {
                var travel = new Travel();
                return travel.IsTravelCity(City.Bejing);
            }
        }
    
        public class Travel
        {
            public bool IsTravelCity(City city)
            {
                switch (city)
                {
                        case City.Bejing:
                        return GetTravelCityBejing();
                        case City.Shanghai:
                        return GetTravelCityShanghai();
                        case City.Suzhou:
                        return GetTravelCitySuzhou();
                    default:
                        return false;
                }
            }
    
            private bool GetTravelCityBejing()
            {
                return true;
            }
            private bool GetTravelCityShanghai()
            {
                return false;
            }
            private bool GetTravelCitySuzhou()
            {
                return false;
            }
        }
    }

    使用策略模式对上图进行重构的代码如下:把三个方法提炼成三个类,并继承IGetTravelCity类,调用时候可以通过IEnumerable<IGetTravelCity>来解除上图的Switch Case语句。

    
    
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Linq;
    namespace StrategyPatternTest
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                MessageBox.Show(new ClientCode().IsTravelToCity().ToString());
            }
        }
    
        public interface ITravel
        {
             bool TravelCity(City city);
        }
    
        public enum City
        {
            Bejing,
            Shanghai,
            Suzhou
        }
    
        public  class ClientCode
        {
            private Travel _travel;
    
            public Travel Travel
            {
                get
                {
                    return _travel ?? new Travel(new List<IGetTravelCity>()
                        {
                            new GetTravelCityBejing(),
                            new GetTravelCityShanghai(),
                            new GetTravelCitySuzhou()
                        });
                }
            }
    
            public bool IsTravelToCity()
            {
                return Travel.TravelCity(City.Bejing);
            }
        }
    
        public class Travel:ITravel
        {
            private IDictionary<City, IGetTravelCity> TraveltoCity { get; set; }
    
            public Travel(IEnumerable<IGetTravelCity> traveltoCity)
            {
                TraveltoCity = traveltoCity.ToDictionary(v => v.City);
            }
    
    
            public  bool TravelCity(City city)
            {
                return TraveltoCity[city].IsTravelCity();
            }
        }
    
        public interface IGetTravelCity
        {
            City City { get; }
            bool IsTravelCity();
        }
        public class GetTravelCityBejing : IGetTravelCity
        {
            public City City 
            {
                get { return City.Bejing;}
            }
            public bool IsTravelCity()
            {
              return  true;
            }
        }
         public class GetTravelCityShanghai : IGetTravelCity
        {
            public City City 
            {
                get { return City.Shanghai;}
            }
            public bool IsTravelCity()
            {
              return  false;
            }
        }
         public class GetTravelCitySuzhou : IGetTravelCity
        {
            public City City 
            {
                get { return City.Suzhou;}
            }
            public bool IsTravelCity()
            {
              return  false;
            }
        }
    
    }

    欢迎园友拍砖,小弟才疏学浅,写此随笔只为交流学习。

  • 相关阅读:
    LeetCode12: 整数转罗马数字
    LeetCode11:盛最多水的容器
    LeetCode09:判断回文数
    LeetCode08:字符串转换成整数
    LeetCode04:寻找中位数
    LeetCode03:无重复字符的最长子串
    《JAVA编程思想》第四版 PDF 下载 中文版和英文版 高清PDF扫描带书签
    XML
    异常
    委托和匿名方法和Lambda表达式
  • 原文地址:https://www.cnblogs.com/canyuexingchen/p/3312488.html
Copyright © 2011-2022 走看看