“策略模式”遵循了最基本的一条设计原则,将程序中经常需要改变的部分提取出来,使它与程序中不变的部分分离,并且“策略模式”能使设计更具有意义且便于维护。比如:
public void eat() { System.out.println("所有都会吃饭"); } public abstract void programming(); // 将开发程序设计为抽象方法}
以上的类作为父类存在一些问题:
1. 关于eat方法,每个人吃饭的方式可能会不同,有的人吃中餐,有的人吃西餐等等。这就导致各个子类继承Person类后会重写的eat()方法,并且很有可能在设计时会派生出Chinese或者English等等一系列类,Chinese类的eat()方法实现为吃中餐,English类的eat()方法实现为吃西餐,再分别由Chinese类和English类派生下边的子类,以实现eat()方法的最大限度的重用。 如果像前面那样设计又有问题出现了,对于Chinese类,中国人也可能会使用刀叉吃西餐,但是大多数时间吃中餐。这样听起来好像eat()方法需要在使用过程中不断的被变动。确实,看完下边的问题会给出解决办法。
2. 再看看programming()方法,开发程序这个方法,对于看这篇文章的人可能都适合继承此类,但是对于很多非IT人士都是不会开发程序的,所以programming()这个方法放在父类中确实存在问题,它导致了不会programming()的人也继承了programming()方法。
“策略模式”可以很好的解决以上问题,根据最基本的一条设计原则,将程序中经常需要改变的部分提取出来,使它与程序中不变的部分分离来看看下边的代码:
以上一系列针对Person类的改动和新增的类即为应用了“策略模式”后的结果。针对以上已经设计好的类和接口做一个测试: