设计模式---复合模式(策略-适配器-装饰者-抽象工厂-组合-观察者)

在复合模式中主要以综合运用之前学习的几种模式为目的,包括策略模式-适配器模式-装饰者模式-抽象工厂模式-组合模式-观察者模式

其中以观察者模式比较复杂。


主要实现功能:当被观察者发生quack()方法时会自动通知观察者,且会统计叫声次数。

/*

     * 1 实现Quack接口的鸭子们使用的策略模式,作为一种武器
     * 2 实现Quack接口的鹅是通过适配器模式把鹅传进去  使用相同的接口完成不同的方法,也方便使用多态
     * 3 使用装饰着模式来拓展功能 比继承要好(类似IO保留原来的功能) 此处加上计数功能
     * 4 使用抽象工厂生产带有装饰着鸭子,使用工厂模式把new的过程全部封装起来,外面创建对象只需要调用对应方法即可
     * 5 使用组合模式可以像对待一个对象一样对待集合  即叶节点和组合都要实现同一个接口以完成相同的工作
     * 6 使用观察者模式可以观察个别对象的行为,此处为观察者想要观察个别鸭子的行为,注意鸭子需要委托一个observable来通知观察者

     */


下面分开按照模式来详细拆分代码:

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不包含其他功能。

注意 所有的操作其实都是对最下层的鸭子进行操作


主要测试代码:


结果截图:


加油~王斐!


你可能感兴趣的:(设计模式)