1700465414
设计模式之禅 18.2 策略模式的定义
1700465415
1700465416
策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(Policy Pattern)。其定义如下:
1700465417
1700465418
Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)
1700465419
1700465420
这个定义是非常明确、清晰的,“定义一组算法”,看看我们的三个计谋是不是三个算法?“将每个算法都封装起来”,封装类Context不就是这个作用吗?“使它们可以互换”当然可以互换了,都实现是相同的接口,那当然可以相互转化了。我们看看策略模式的通用类图,如图18-3所示。
1700465421
1700465422
1700465423
1700465424
1700465425
图18-3 策略模式通用类图
1700465426
1700465427
策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,我们再来看看策略模式的三个角色:
1700465428
1700465429
❑Context封装角色
1700465430
1700465431
它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
1700465432
1700465433
❑Strategy抽象策略角色
1700465434
1700465435
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。各位看官可能要问了,类图中的AlgorithmInterface是什么意思,嘿嘿,algorithm是“运算法则”的意思,结合起来意思就明白了吧。
1700465436
1700465437
❑ConcreteStrategy具体策略角色
1700465438
1700465439
实现抽象策略中的操作,该类含有具体的算法。
1700465440
1700465441
我们再来看策略模式的通用源码,非常简单。先看抽象策略角色,它是一个非常普通的接口,在我们的项目中就是一个普通得不能再普通的接口了,定义一个或多个具体的算法,如代码清单18-7所示。
1700465442
1700465443
代码清单18-7 抽象的策略角色
1700465444
1700465445
public interface Strategy{
1700465446
1700465447
//策略模式的运算法则
1700465448
1700465449
public void doSomething();
1700465450
1700465451
}
1700465452
1700465453
具体策略也是非常普通的一个实现类,只要实现接口中的方法就可以,如代码清单18-8所示。
1700465454
1700465455
代码清单18-8 具体策略角色
1700465456
1700465457
public class ConcreteStrategy1 implements Strategy{
1700465458
1700465459
public void doSomething(){
1700465460
1700465461
System.out.println(“具体策略1的运算法则”);
1700465462
[
上一页 ]
[ :1.700465413e+09 ]
[
下一页 ]