设计模式之1-策略模式

2013-04-13 | 发布者: 本站| 查看: 694|

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


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

[csharp] view plaincopy
  1. //抽象算法类  
  2. abstract class Strategy  
  3. {   
  4.     //算法方法  
  5.     public abstract void AlgorithmInteface();  
  6. }  


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

[csharp] view plaincopy
  1. //具体算法A  
  2. class ConcreteStrategyA : Strategy  
  3. {   
  4.     //算法A实现方法  
  5.     public override void AlgorithmInteface()  
  6.     {  
  7.         Console.WriteLine("算法A实现");  
  8.     }  
  9. }  
  10.   
  11. //具体算法B  
  12. class ConcreteStrategyB : Strategy  
  13. {  
  14.     //算法B实现方法  
  15.     public override void AlgorithmInteface()  
  16.     {  
  17.         Console.WriteLine("算法B实现");  
  18.     }  
  19. }  
  20.   
  21. //具体算法C  
  22. class ConcreteStrategyC : Strategy  
  23. {  
  24.     //算法C实现方法  
  25.     public override void AlgorithmInteface()  
  26.     {  
  27.         Console.WriteLine("算法C实现");  
  28.     }  
  29. }  


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

[csharp] view plaincopy
  1. //上下文  
  2. class Context  
  3. {  
  4.     Strategy strategy;  
  5.     public Context(Strategy strategy)  
  6.     {  
  7.         this.strategy = strategy;  
  8.     }  
  9.     //上下文接口  
  10.     public void ContextInterface()  
  11.     {  
  12.         strategy.AlgorithmInteface();  
  13.     }  
  14. }  


客户端代码

[csharp] view plaincopy
  1. static void Main(string[] args)  
  2. {  
  3.     Context context;  
  4.   
  5.     context = new Context(new ConcreteStrategyA());  
  6.     context.ContextInterface();  
  7.   
  8.     context = new Context(new ConcreteStrategyB());  
  9.     context.ContextInterface();  
  10.   
  11.     context = new Context(new ConcreteStrategyC());  
  12.     context.ContextInterface();  
  13.   
  14.     Console.Read();  
  15. }  


 

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

上一篇:性能测试指标的基本概念 下一篇:【SQL】数据首字母按英文查询
更多

咨询热线:18680769880

Copyright © 巴适网络 All Rights Reserved 版权声明 渝ICP备15005483号-1

重庆网络营销|重庆移动互联网营销|重庆微营销|重庆微服务|重庆云广告|重庆云商场|重庆微官网

巴适在线
【电话】18523625039
【电话】18680769880
【售前1】 巴适网络 838922836
【售前2】 巴适网络 421643133
【售前3】 巴适网络 952056566
【售后1】 巴适网络 493434274
【售后2】 巴适网络 421643133
【地址】 (深圳市宝安区)
【巴适网络】
【www.bashinet.com】