2019独角兽企业重金招聘Python工程师标准>>>
问题引入:
有一只火鸡,想用火鸡冒充鸭子,已知火鸡的类如下图:
鸭子的接口为:
解决方案:
提供一个由火鸡转为鸭子的适配类,这个适配器类需要实现Duck接口。
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
适配器模式:
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
对象适配器:采用组合的方式,上述的示例就是使用的组合方式
类适配器:采用继承的方式实现。利用继承解决方案如下:
public class TurkeyAdapter2 extends WildTurkey implements Duck {
@Override
public void quack() {
super.gobble();
}
@Override
public void fly() {
super.fly();
}
}
两种适配器的比较:
类适配器针对的是具体的类做的适配,因为一个适配器只能适配一个具体类,而对象适配器是利用的组合,一个适配器可以针对所有子类。
问题引入:
观赏电影需要执行一系列的动作,例如将灯光调暗,将屏幕放下,打开功放,调高音量,打开dvd。。。。
而这些操作是多个类的行为。如何让使用者不关心这些复杂的过程呢?
引入外观设计模式:
创建一个接口简化而统一的类,用来包装子系统中一个或者多个复杂的类。
外观模式的定义:
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易实现。
最少知识原则:只和你的密友谈话。
减少对象之间的交互,不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。如果许多类中相互依赖,那么这个系统将会变得复杂、易碎、不便维护。
如何避免违背最少知识的原则:
1、如果某个对象调用其他的方法的返回结果,不要调用该对象的方法。
2、把组件想象成是被实例变量所引用的任何对象,换句话说,把这想象是“有一个”关系。
对象适配器模式、外观模式、装饰者模式的区别:
适配器是将一个对象包装起来以改变其接口;
装饰着将一个对象包装起来以增加新的行为和责任;而外观将一群对象包装起来以简化其接口。