设计模式之行为模式:策略(Strategy)

意图

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

适用性

  • 许多相关的类仅仅是行为有异。策略模式提供了一种用多个行为中的一个行为来配置一个类的方法;
  • 需要适用一个算法的不同变体
  • 算法使用客户不应该知道的数据。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。

结构

参与者

  • Strategy

  1. 定义所有支持的算法的公共接口

  • ConcreteStrategy

  1. 以Strategy接口实现某具体算法

  • Context

  1. 用一个ConcreteStrategy对象来配置

  2. 维护一个对Strategy对象的引用

  3. 可定义一个接口来让Strategy访问它的数据

协作

  • Strategy和Context相互作用实现选定的算法。当算法被调用时,Context可以将该算法所需要的所有数据都传递给该strategy。或者Context可以将自身作为一个参数传递给Strategy操作。这就让Strategy在需要时可以回调Context.

  • Context将它的客户的请求转发给它的strategy。客户通常并传递一个concreteStrategy对象给Context;这样客户仅与Context交互,通常有一系列的ConcreteStrategy类供客户从中选择。

效果

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

  2. 一个替代继承的方法 继承提供了另一种支持多种算法或行为的方法

  3. 消除了一些条件语句 Strategy模式提供了用条件语句所需的行为以外的另一种选择。

  4. 实现的选择,Strategy模式可以提供相同行为的不同实现。

  5. 客户必须了解不同的strategy。

  6. Strategy和Context之间的通信开销。

  7. 增加了对象的数目

实现

  1. 定义了Strategy和Context接口,Strategy和Context接口必须使得ConcreteStrategy能够有效地访问它所需要的Context中的任务数据,反之亦然。一种办法是让Context将数据放在参数中传递给Strategy操作,也就是说将数据发送给Strategy。
  2. 将 Strategy作为模板参数
  3. 使Strategy对象成为可选的

实现


    class StrategyStructure
    {
        public void Test()
        {
            Strategy strA = new ConcreteStarategyA();
            Strategy strB = new ConcreteStarategyB();
            Context context = new Context();
            context.Strategy = strA;
            context.Operation();

            context.Strategy = strB;
            context.Operation();

        }

    }

    abstract class Strategy
    {
        public abstract void AlgorithmInterface( Context context); 
    }

    class ConcreteStarategyA :Strategy
    {
        public override void AlgorithmInterface(Context context)
        {
            Console.WriteLine(context.GetType().Name + " in "+this.GetType().Name+" 执行");
        }

    }

    class ConcreteStarategyB : Strategy
    {
        public override void AlgorithmInterface(Context context)
        {
            Console.WriteLine(context.GetType().Name + " in " + this.GetType().Name + " 执行");
        }

    }

    class Context
    {
        private Strategy _strategy;
        public Strategy Strategy {
            set { _strategy = value; }
        }

        public void Operation()
        {
            _strategy.AlgorithmInterface(this);
        }
    }

相关算法

    Flyeight:Strategy使很好的轻量级对象; 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值