美文网首页
设计模式之策略模式

设计模式之策略模式

作者: _凉笙 | 来源:发表于2017-12-07 17:59 被阅读0次
    策略模式定义:

    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

    策略模式的功能

    策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
    策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。

    优缺点

    优点:
    1.提供了一种替代继承方法,而且既保持了继承的优点,还比继承更灵活
    2.避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展
    3.高内聚,低耦合

    缺点:
    1.因为每个具体策略模式都会产生一个新类,所以会增加系统需要维护的类的数量

    使用场景:
    1.多个类之区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为.
    2.需要在不同情况下使用的算法,或者算法还可以在未来用其他方式来实现.
    3.对客户隐藏具体算法的实现细节,彼此完成独立

    策略模式原型代码实现

    首先先来看看UML图,context为策略拥有者,IStategy策略的接口,然后下面是两个策略类,这样设计的话可以很轻易的就更改需要使用的策略。


    image.png

    下面是代码的实现

    using UnityEngine;
    
    public class DM03Strategy:MonoBehaviour
    {
        private void Start()
        {
            StrategyContrxt contex = new StrategyContrxt();
            contex.stragegy = new ConcreteStrategyA();
    
            contex.Cal();
        }
    
    }
    
    public class StrategyContrxt
    {
       public  IStrategy stragegy;
        public void Cal()
        {
            stragegy.Cal();
        }
    }
    public interface IStrategy
    {
        void Cal();
    }
    public class ConcreteStrategyA : IStrategy
    {
        public void Cal()
        {
            Debug.Log("使用A策略计算");
        }
    }
    public class ConcreteStrategyB : IStrategy
    {
        public void Cal()
        {
            Debug.Log("使用B策略计算");
        }
    }
    

    输出:


    image.png

    需要修改到B策略只需要修改Start方法里面的接口IStrategy对应的实现就行了
    contex.stragegy = new ConcreteStrategyB();


    image.png
    总结

    1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

    2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。

    3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

    策略模式
    http://www.uml.org.cn/sjms/201009092.asp
    http://blog.csdn.net/hguisu/article/details/7558249

    相关文章

      网友评论

          本文标题:设计模式之策略模式

          本文链接:https://www.haomeiwen.com/subject/gxkjixtx.html