策略模式

Posted ningxinjie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

策略模式是我个人觉得很有用的模式,它有用的点就是在于:正常情况下按照对象方法传递的种类不同,那么我们触发的方法不同

按照正常写法,我们定义枚举,将枚举类型对应选择的方法写在类的内部,这样一旦出现新的一类,不但需要在枚举类型中修改增加,也需要在实现类中修改增加

 enum Myenum
    {
        QuickSort,
        ShellSort,
        MergeSort,
    }
    class Sort
    {
        #region ArrayList基本设置
        private ArrayList _arr = new ArrayList();
        public void Add(string str)
        {
            _arr.Add(str);
        }
        public void Remove(string arr)
        {
            _arr.Remove(arr);
        }
        public void ShowArrayList()
        {
            foreach (string item in _arr)
            {
                Console.WriteLine(item);
            }
        }
        #endregion

        public void SortList(Myenum en)
        {
            if(en==Myenum.QuickSort)
            {
                Console.WriteLine("执行QuickSort后序方法");
            }
            else if(en==Myenum.MergeSort)
            {
                Console.WriteLine("执行MergeSort后序方法");
            }
            else if(en==Myenum.ShellSort)
            {
                Console.WriteLine("执行ShellSort后序方法");
            }
        }
    }

 

如果我将枚举类型排序具体逻辑扯出来,变成中介,这样本类就可以实现了封装,以后再增加逻辑的时候 ,可以保持原中间不动,新增一个中介(面向接口编程实现),但是枚举类型无法封装

   //暂时还是这三种枚举类型
    enum Myenum
    {
        QuickSort,
        ShellSort,
        MergeSort,
    }
 //增加一个中介者
    interface Center
    {
        void SortList(ArrayList arr);
    }
   //中介者具体实现类
   //这样即使Center1不可以再修改,那么我可以在新建一个类,在新建的类中实现我想要的逻辑
    class Center1 : Center
    {
        private Myenum _en;
        public Center1(Myenum en)
        {
            _en = en;
        }
        public void SortList(ArrayList arr)
        {
            if(_en== Myenum.QuickSort)
            {
                arr.Sort();
                Console.WriteLine("QuickSort排续方法");
            }
        }
    }
   //排序类,自此被封装
   class Sort
    {
        #region ArrayList基本设置
        private ArrayList _arr = new ArrayList();
        public void Add(string str)
        {
            _arr.Add(str);
        }
        public void Remove(string arr)
        {
            _arr.Remove(arr);
        }
        public void ShowArrayList()
        {
            foreach (string item in _arr)
            {
                Console.WriteLine(item);
            }
        }
        #endregion

        public void SortList(Center center)
        {
            center.SortList(_arr);
        }
    }
   static void Main(string[] args)
        {
            Sort sort = new 策略模式.Sort();
            sort.Add("ss"); sort.Add("dd"); sort.Add("aa"); sort.Add("tt");
            sort.SortList(new Center1(Myenum.QuickSort));
            sort.ShowArrayList();
            Console.ReadKey();
        }

技术图片

 

 

如果将上方枚举的各个类型转变为中介的具体实现,这样如果以后有新增的方法逻辑,只需要为该类型定义一个类,即可完成,从而实现不修改任何地方达到解耦。这就是策略模式

  interface Center
    {
        void SortList(ArrayList arr);
    }
//具体实现类型
  class QuickSort : Center
    {
        public void SortList(ArrayList arr)
        {
            arr.Sort();
            Console.WriteLine("QuickSort后续方法");
        }
    }
    class ShellSort : Center
    {
        public void SortList(ArrayList arr)
        {
            arr.Sort();
            Console.WriteLine("ShellSort后续方法");
        }
    }

 

   //与上方相同,无变化的排序类,已经被封装了
    class Sort
    {
        #region ArrayList基本设置
        private ArrayList _arr = new ArrayList();
        public void Add(string str)
        {
            _arr.Add(str);
        }
        public void Remove(string arr)
        {
            _arr.Remove(arr);
        }
        public void ShowArrayList()
        {
            foreach (string item in _arr)
            {
                Console.WriteLine(item);
            }
        }
        #endregion

        public void SortList(Center center)
        {
            center.SortList(_arr);
        }
    }
static void Main(string[] args)
        {
            Sort sort = new 策略模式.Sort();
            sort.Add("ss"); sort.Add("dd"); sort.Add("aa"); sort.Add("tt");
            //sort.SortList(new Center1(Myenum.QuickSort));
            sort.SortList(new ShellSort());//换成了这个
            sort.ShowArrayList();
            Console.ReadKey();
        }

技术图片

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式