结构
参与者• Abstraction (Window)
— 定义抽象类的接口。
继续前面的说法,这里的抽象是相对于实现部分来说的,作者认为更恰当的说法或许应该是接口类。这个类的接口一定是面向用户领域的。
— 维护一个指向Implementor类型对象的指针。
通过指向具象实现类的指针来调用真正的实现代码。
• RefinedAbstraction (IconWindow)
— 扩充由Abstraction定义的接口。
客户领域中的派生类,Icon也是客户领域的概念。
• Implementor (WindowImp)
— 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲, Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
接口类调用实现类的接口来实现自己的功能。如果是窗口类,这可以接口可以用于绘制窗口元素,如果是通讯类这个类可以用于发送和接受数据。
• ConcreteImplementor (XwindowImp, PMWindowImp)
— 实现Implementor接口并定义它的具体实现。
实现类接口的具象类。这里是真正完成功能的地方。它在另外的地方,另外的时间点被实现,根据需要随时可以替换既有的实现类。
协作• Abstraction将client的请求转发给它的Implementor对象。
重点在于接口类不会在自己类内部或者派生类内部实现功能,二是转交给实现类,从而实现了实现部分可替换。
作者观点
还是那几句话:
-
想要变那一部分,就把那一部分抽象成一个类。
-
接口类(抽象类)面向客户提供客户领域的操作。
-
实现类提供可替换的实现。
注:
本文中
蓝 {MOD}粗体文字都引自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】