设计模式利剑12-策略模式

时间:2022-02-21 00:38:20
 

定      义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换

优      点:

              1、算法可以*切换

              2、避免使用多重条件判断

              3、扩展性好

缺      点:

              1、策略类数量多

              2、所有的策略类都需要对外暴露

使用场景:

              1、多个类只有在算法或行为上稍有不同的场景

              2、算法需要*切换的场景

              3、需要屏蔽算法规则的场景

应用案例:

            先来看看策略模式的UML图:

设计模式利剑12-策略模式                1、Context封装角色:起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化

               2、Strategy抽象策略角色:策略、算法家族的抽象,通常为借口,定义每个策略或uanfa必须具有的方法和属性

              先来看一个历史故事吧,著名的东吴赔了夫人又折兵的故事,诸葛亮给了赵云三条妙计藏于锦囊中,用来应对东吴为难刘备之事,这个是一个典型的策略模式,现在来看一看UML图:

设计模式利剑12-策略模式               我是一个多子女家庭,让我想起了我小时候上学,我觉得也可以封装成策略模式,妈妈起床给各个孩子准备好衣服、书包和早餐,孩子起床后,要问妈妈我的衣服书包和早餐在那里,妈妈告诉我们,我们便知道了一天要开始做什么了,用UML图实现如下:

设计模式利剑12-策略模式

 

经过如此设计以后,那孩子们再也不用操心因为学前事务而迟到了,他们都依赖于他们的妈妈了,妈妈就是将一组算法封装起来,给孩子们更方便的接口。

  1. Public Interface IStrategy  
  2.     Sub operation()  
  3. End Interface ' IStrategy  
  4. Public Class BackDoor  
  5.     Implements IStrategy  
  6.     Public Sub operation() Implements IStrategy.operation  
  7.         Console.WriteLine("找乔国老帮忙,让吴国太给孙权施加压力")  
  8.     End Sub  
  9. End Class ' BackDoor  
  10. Public Class BlockEnemy  
  11.     Implements IStrategy  
  12.     Public Sub operation() Implements IStrategy.operation  
  13.         Console.WriteLine("孙夫人断后,挡住追兵")  
  14.     End Sub  
  15. End Class ' BlockEnemy  
  16. Public Class GivenGreenLight  
  17.     Implements IStrategy  
  18.     Public Sub operation() Implements IStrategy.operation  
  19.         Console.WriteLine("找吴国太开绿灯,放行")  
  20.     End Sub  
  21. End Class ' GivenGreenLight  
  22.   
  23. Public Class Context  
  24.     Private m_IStrategy As IStrategy = Nothing  
  25.     Public Sub operation()  
  26.         m_IStrategy.operation()  
  27.     End Sub  
  28.     '''    
  29.     ''' <param name="__IStrategy"></param>  
  30.     Public Sub New(ByVal __IStrategy As IStrategy)  
  31.         m_IStrategy = __IStrategy  
  32.     End Sub  
  33. End Class ' Context  
  34. Module zhaoyun  
  35.     Sub Main()  
  36.         Console.WriteLine("赵云与刘备来到吴国")  
  37.         Dim _context As Context  
  38.         Console.WriteLine("执行第一个计划")  
  39.         _context = New Context(New BackDoor)  
  40.         _context.operation()  
  41.         Console.WriteLine("刘备乐不思蜀了,执行第二个计划")  
  42.         _context = New Context(New GivenGreenLight)  
  43.         _context.operation()  
  44.         Console.WriteLine("回家有追兵了,执行第三个计划")  
  45.         _context = New Context(New BlockEnemy)  
  46.         _context.operation()  
  47.         Console.Read()  
  48.     End Sub  
  49. End Module