• 策略模式


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

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

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

  • 相关阅读:
    A20的板子笔记
    RT-Thread信号量的基本操作
    RT-Thread的线程间同步
    RT-Thread多线程导致的临界区问题
    RT-Thread的CPU使用率计算
    RT-Thread 线程的让出
    车牌识别LPR(八)-- 字符识别
    车牌识别LPR(七)-- 字符特征
    车牌识别LPR(六)-- 字符分割
    车牌识别LPR(五)-- 一种车牌定位法
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/12183193.html
Copyright © 2020-2023  润新知