定 义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
优 点:
1、算法可以自由切换
2、避免使用多重条件判断
3、扩展性好
缺 点:
1、策略类数量多
2、所有的策略类都需要对外暴露
使用场景:
1、多个类只有在算法或行为上稍有不同的场景
2、算法需要自由切换的场景
3、需要屏蔽算法规则的场景
应用案例:
先来看看策略模式的UML图:
1、Context封装角色:起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化
2、Strategy抽象策略角色:策略、算法家族的抽象,通常为借口,定义每个策略或uanfa必须具有的方法和属性
先来看一个历史故事吧,著名的东吴赔了夫人又折兵的故事,诸葛亮给了赵云三条妙计藏于锦囊中,用来应对东吴为难刘备之事,这个是一个典型的策略模式,现在来看一看UML图:
我是一个多子女家庭,让我想起了我小时候上学,我觉得也可以封装成策略模式,妈妈起床给各个孩子准备好衣服、书包和早餐,孩子起床后,要问妈妈我的衣服书包和早餐在那里,妈妈告诉我们,我们便知道了一天要开始做什么了,用UML图实现如下:
经过如此设计以后,那孩子们再也不用操心因为学前事务而迟到了,他们都依赖于他们的妈妈了,妈妈就是将一组算法封装起来,给孩子们更方便的接口。
- Public Interface IStrategy
- Sub operation()
- End Interface ' IStrategy
- Public Class BackDoor
- Implements IStrategy
- Public Sub operation() Implements IStrategy.operation
- Console.WriteLine("找乔国老帮忙,让吴国太给孙权施加压力")
- End Sub
- End Class ' BackDoor
- Public Class BlockEnemy
- Implements IStrategy
- Public Sub operation() Implements IStrategy.operation
- Console.WriteLine("孙夫人断后,挡住追兵")
- End Sub
- End Class ' BlockEnemy
- Public Class GivenGreenLight
- Implements IStrategy
- Public Sub operation() Implements IStrategy.operation
- Console.WriteLine("找吴国太开绿灯,放行")
- End Sub
- End Class ' GivenGreenLight
- Public Class Context
- Private m_IStrategy As IStrategy = Nothing
- Public Sub operation()
- m_IStrategy.operation()
- End Sub
- '''
- ''' <param name="__IStrategy"></param>
- Public Sub New(ByVal __IStrategy As IStrategy)
- m_IStrategy = __IStrategy
- End Sub
- End Class ' Context
- Module zhaoyun
- Sub Main()
- Console.WriteLine("赵云与刘备来到吴国")
- Dim _context As Context
- Console.WriteLine("执行第一个计划")
- _context = New Context(New BackDoor)
- _context.operation()
- Console.WriteLine("刘备乐不思蜀了,执行第二个计划")
- _context = New Context(New GivenGreenLight)
- _context.operation()
- Console.WriteLine("回家有追兵了,执行第三个计划")
- _context = New Context(New BlockEnemy)
- _context.operation()
- Console.Read()
- End Sub
- End Module