设计模式: 适配器模式
定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现中解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。
对象和类的适配器
类适配器通过多重继承实现,对象适配器通过组合来实现。类适配器不是使用组合来适配被适配者,而是继承被适配者和目标类。
- 对象适配器可以适配某个类和其子类,类适配器不用重新实现整个被适配者,也可以覆盖其行为。
- 对象适配器具有更大的弹性,但是会有更多的子类,一旦接口发生变更,对象适配器的改动更大
装饰者和适配器
- 适配器“一定”会进行接口的转换,装饰者则“不一定”,装饰者的意图是扩展所包装对象的行为或责任
设计模式:外观模式
定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
外观的意图是提供一个简单的接口,好让一个子系统更容易使用。
设计原则
最少知识原则:只和你的密友交谈
当你正在设计一个系统,不管是任何对象,你都要注意他所交互的类有哪些,并注意它和这些类是如何交互的。
这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,他需要花许多成本维护,也因为太复杂而不容易被其他人了解。
一些指导方针:在任何对象的方法内,我们应该只调用属于如下范围的方法
- 该对象本身
- 被当做方法参数传进来的对象
- 此方法所创建或实例化得任何对象
这些方针告诉我们,如果某对象调用其他的方法返回结果,不要调用该对象的方法。 - 对象的任何组件
把“组件“想象成 是被实例变量所引用的任何对象,换句话说,把这想象成是“有一个”(HAS—A)关系。
这个原则可以减少对象之间的依赖,减少软件维护的成本,但采用这个原则也会导致更多的“包装”类被制造出来,以处理和其他组件的沟通,这可能会导致复杂度和开发时间的增加,并降低运行时性能。
要点:
- 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器
- 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观
- 适配器改变接口以符合客户的期望
- 外观将客户从一个复杂的子系统中解耦
- 实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂程度而定
- 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
- 适配器有两种形式:对象适配器和类适配器。类适配器需要用到多重继承
- 你可以为一个子系统实现一个以上的外观
- 适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装“起来以简化其接口