在复合模式中主要以综合运用之前学习的几种模式为目的,包括策略模式-适配器模式-装饰者模式-抽象工厂模式-组合模式-观察者模式
其中以观察者模式比较复杂。
主要实现功能:当被观察者发生quack()方法时会自动通知观察者,且会统计叫声次数。
/*
* 1 实现Quack接口的鸭子们使用的策略模式,作为一种武器*/
下面分开按照模式来详细拆分代码:
1 策略模式
所有的鸭子都要实现Quackble接口来实现quack方法,每一个鸭子都要实现,此处Quackble又继承QuackObservable,是因为鸭子是一个被观察者,也要实现注册观察者和通知观察者的方法,只不过这里鸭子是委托给专门的类去做这件事,在后面观察者模式会被详细提到。
MallardDuck使用策略模式
2 适配器模式
这里有鹅的叫方法,但是方法名字honk和鸭子quack不一样,所以有了一个想要使用同一个接口方法quack()的需求
适配器GooseAdapter,需要把原来的鹅给传进适配器,方可使用相同的接口方法
3 装饰着模式
类似于IO,可以把一个类包装起来,使得功能更加强大,其实就是把原来的类用构造方法传进去再扩展一些方法即可
实现功能的扩展 比继承好用。这里本来是一个普通的鸭子来实现Quackable方法,但此处用另一个类代替实现,原先的功能通过构造方法传进来普通类的引用进行原先方法调用,不仅没有丧失,而且又增加了一些方法,比如此处的计数功能,用一个静态变量去计数。
在new的时候new QuackCounter(new MallardDuck())就是一个新的包装的对象,原来的方法存在且增加新的
4抽象工厂模式
用一个抽象类,里面包含几种工厂方法用于产生不同的鸭子
实现抽象类的实现类,此处Create的是经过包装的装饰着鸭子,每产生一个quack时都会进行计数
创建对象时可以直接用抽象工厂的方法进行new
5 组合模式
如果想要组合中的每一个都实现quack方法,那么组合类一定要实现Quackable接口并且实现quack方法,在方法里面使用迭代器对每一个使用quack方法。
6 观察者模式
一个鸭子可以对应多个观察者(用ArrayList),同时也可以多个观察者(组合)对应一个观察者。
使用观察者模式可以观察个别对象的行为,此处为观察者想要观察个别鸭子的行为,注意鸭子需要委托一个observable来通知观察者
观察者需要向鸭子们来注册,鸭子们也会及时通知观察者,当然这一切都是通过observable来作为一个代理来实现。
QuackObservable接口来定义注册和通知观察者的方法。
当被观察者发生quack()方法时会自动通知观察者,此处是一群flock组合去作为被观察者。
class Observable类需要在构造方法加入鸭子或者组合,因为鸭子河组合都是委托Observable类来进行注册和通知的操作,在通知操作中,Observer会调用已经传进来的duck,进行update()方法操作
Observable只实现QuackObservable不包含其他功能。
注意 所有的操作其实都是对最下层的鸭子进行操作
主要测试代码:
结果截图:
加油~王斐!