• Unity实现设计模式——策略模式


    Unity实现设计模式——策略模式

    策略模式是一种定义一些列算法的方法,这些所有的算法都是完成相同的工作,只是实现不同。它可以通过相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。

    策略模式的 Strategy 类层次为 Context 定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

    策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

    需要注意的是策略模式与工厂模式的区别
    简单工厂模式下,产品类(父类)里包含了产品的属性,所以每个具体产品(子类)也就包含了同样的属性。
    策略模式下,策略类(父类)里只提供了虚方法,并没有包含属性,所以每个具体的算法有自己独立的属性。

    在这里插入图片描述
    下面使用对于一个结构进行排序的例子来演示

    1.SortStrategy(The ‘Strategy’ abstract class)

        abstract class SortStrategy
        {
            public abstract void Sort(List<string> list);
        }
    
    • 1
    • 2
    • 3
    • 4

    2.派生类

    (1)QuickSort

        class QuickSort : SortStrategy
        {
            public override void Sort(List<string> list)
            {
                list.Sort(); // Default is Quicksort
                Debug.Log("-------QuickSorted list------- ");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)ShellSort

        class ShellSort : SortStrategy
        {
            public override void Sort(List<string> list)
            {
                //list.ShellSort(); not-implemented
                Debug.Log("-------ShellSorted list------- ");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (3)MergeSort

        class MergeSort : SortStrategy
        {
            public override void Sort(List<string> list)
            {
                //list.MergeSort(); not-implemented
                Debug.Log("-------MergeSorted list------- ");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.SortedList(The ‘Context’ class)

        class SortedList
        {
            private List<string> _list = new List<string>();
            private SortStrategy _sortstrategy;
    
            public void SetSortStrategy(SortStrategy sortstrategy)
            {
                this._sortstrategy = sortstrategy;
            }
    
            public void Add(string name)
            {
                _list.Add(name);
            }
    
            public void Sort()
            {
                _sortstrategy.Sort(_list);
                // Iterate over list and display results
                foreach (string name in _list)
                {
                    Debug.Log(" " + name);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4.测试

        public class StrategyPatternExample1 : MonoBehaviour
        {
            void Start()
            {
                // Two contexts following different strategies
                SortedList studentRecords = new SortedList();
    
                studentRecords.Add("Samual");
                studentRecords.Add("Jimmy");
                studentRecords.Add("Sandra");
                studentRecords.Add("Vivek");
                studentRecords.Add("Anna");
    
                studentRecords.SetSortStrategy(new QuickSort());
                studentRecords.Sort();
    
                studentRecords.SetSortStrategy(new ShellSort());
                studentRecords.Sort();
    
                studentRecords.SetSortStrategy(new MergeSort());
                studentRecords.Sort();
    
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    使用kubeadm方式搭建Kubernetes集群
    HTML+CSS+JS鲜花商城网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计
    【Python 千题 —— 基础篇】奇数列表
    从零开始学习Dubbo2——什么是Dubbo和zookeeper的安装
    js---构造函数
    三天打鱼两天晒网
    【AIGC专题】Stable Diffusion 从入门到企业级实战0403
    TNT平台
    编译nw-node版本的插件
    Java面试之数据类型
  • 原文地址:https://blog.csdn.net/zzzsss123333/article/details/133681864