设计模式之1——策略模式


生活案例
        跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,关键是追MM锦囊中有好多Strategy哦。
计算机中的动机
        而软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
概念
       策略模式定义了算法家庭,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。————《设计模式》GOF


代码
        Strategy类,定义所有支持的算法的公共接口

//抽象算法类
abstract class Strategy
{ 
    //算法方法
    public abstract void AlgorithmInteface();
}


        ConcreteStrategy,封装了具体的算法或行为,继承于Strategy

//具体算法A
class ConcreteStrategyA : Strategy
{ 
    //算法A实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法A实现");
    }
}

//具体算法B
class ConcreteStrategyB : Strategy
{
    //算法B实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法B实现");
    }
}

//具体算法C
class ConcreteStrategyC : Strategy
{
    //算法C实现方法
    public override void AlgorithmInteface()
    {
        Console.WriteLine("算法C实现");
    }
}


        Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

//上下文
class Context
{
    Strategy strategy;
    public Context(Strategy strategy)
    {
        this.strategy = strategy;
    }
    //上下文接口
    public void ContextInterface()
    {
        strategy.AlgorithmInteface();
    }
}


客户端代码

static void Main(string[] args)
{
    Context context;

    context = new Context(new ConcreteStrategyA());
    context.ContextInterface();

    context = new Context(new ConcreteStrategyB());
    context.ContextInterface();

    context = new Context(new ConcreteStrategyC());
    context.ContextInterface();

    Console.Read();
}


 

优缺点
        优点
        提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
        避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
        缺点
        因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
        解决方案工厂方法

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值