C# 设计模式-策略模式

一.介绍  

  策略模式(Stragety Pattern)。属于行为型模式。它定义了算法(行为)家族,分别封装起来,使得它们之间可以相互替换,此模型让算法(行为)的变化,不会影响到使用该算法(行为)的客户。

二.实现

  举个例子,一辆车(Car类)里有轮胎(Tyre类)才能跑(Run),不同情况需要使用不同的轮胎,可以在Run方法里根据if/else去使用不同的轮胎(创建对象),但如果以后情况越来越多,需要的轮胎种类越来越多,就得频繁修改Run方法,这就违反了开闭原则。

  又或者说,在同一个轮胎里根据不同情况实现不同功能,但这都有可能需要进行多次修改,同样违反开闭原则。

  所以,这种情况就可以使用策略模式。

//环境角色(Context)
public class Car
{
    Tyre tyre;

    public void SetTyre(Tyre tyre)
    {
        this.tyre = tyre;
    }

    public void Run()
    {
        if (tyre != null)
        {
            Console.WriteLine(tyre.SetKind() + "");
        }
        else
        {
            Console.WriteLine("没轮胎跑不了");
        }
    }
}

//抽象策略角色(Strategy)
public abstract class Tyre
{
    public abstract string SetKind();
}

//具体策略角色(ConcreteStrategy)
public class CommonTyre : Tyre
{
    public override string SetKind()
    {
        return "用普通轮胎";
    }
}

//具体策略角色(ConcreteStrategy)
public class RainTyre : Tyre
{
    public override string SetKind()
    {
        return "用雨胎";
    }
}

//调用
public static void Main(string[] args)
{
    Car c = new Car();
    //普通情况,装普通轮胎跑
    c.SetTyre(new CommonTyre());
    c.Run();
    //下雨了,装雨胎
    c.SetTyre(new RainTyre());
    c.Run();
}

  在策略模式下,它将Tyre对象的创建放在了外部,根据不同情况再把不同Tyre对象传到Car对象里,使得Car类不依赖于Tyre类,高层和底层解耦,其实该模式就是符合依赖倒置的设计原则。

三.总结

  优点:

  1.由于轮胎(策略类)都使用同一个接口,使得它们可以自由切换。

  2.易于拓展。新增一个轮胎(策略类)只需要添加一个新的具体轮胎(策略类)就行,基本不需要修改原有代码。

  3.避免使用多重条件选择语句,充分体现出面向对象的思想。

  缺点:

  1.客户端必须知道所有的轮胎(策略类),并决定使用哪一个轮胎(策略类)。

  2.策略模式会造成有多个策略类。

原文地址:https://www.cnblogs.com/shadoll/p/14323683.html