文章目录
Adapter概念
Adapter(适配器):把一个类的接口转换成用户所期望的另一个接口。适配器能够让两个不兼容的接口一起工作。
假设你已经有一个软件系统,现在你想要让这个软件系统给一个新的供应商使用。但是你们的接口设计是不同的。适配器的工作就是作为他们之间的中间件。对接口的数据进行转换,使得这里两个能够在一起运行。(像个翻译)
实例
让火鸡(turkey)能够像鸭子(Duck)一样被调用:
//接口设计:鸭子
public interface Duck{
public void quack();
public void fly();
}
//接口设计:火鸡
public interface Turkey{
public void gobble();
public void fly();
}
//鸭子的一个实例
public class MallardDuck implements Duck{
public void quck(){
....
}
public void fly(){
...
}
}
//火鸡的一个实例
public class MallardTurkey implements Turkey{
public void gobble(){
...
}
public void fly(){
...
}
}
我们想要使用调用Duck的方式来调用Turkey的功能。就需要设计一个适配器的接口:
//适配器设计, 要实现Duck接口的所有方法。
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
public void quack(){
//Duck的quack方法映射到的Turkey方法。
turkey.gobble();
}
public void fly(){
turkey.fly();
}
}
使用:
//step1
WildTurkey turkey = new WildTurkey();
//step2
Duck turkeyAdapter = new TurkeyAdapter(turkey);
//step3
turkeyAdapter.quack();
...
对象(Object)适配器和类(Class)适配器
-
上面的例子就是Object Adapter。
-
class Adapter需要多重继承才能使用,这在java里是不被允许的。但是如果使用其他的可以多重继承的语言,就可以使用类适配器。
这时适配器是被代理的一个子类。
一个案例
古老的java代码对于结合遍历使用的是Enumeration接口。 在新的Java
的是迭代器Iterators接口。
如果项目中有古老的代码使用的是Enumeration接口。在继续写入新的代码时使用Iterator接口进行遍历。那么我们就要对之前的Enumeration设置一个代理。去实现Iterator接口的功能。
注意:在老的Enumeration中没有类似Iterator的remove功能。所以可以通过抛出一个UnsupportedOperationException()异常来处理。
Facade Pattern
概念
为一系列子系统接口提供了一个统一的接口。Facade定义了一个更高层的接口使得子系统更容易去使用。
是一个简单直接的方法。比如想看电视。那么就新建一个家庭影音的类,这个类的子函数watchMovie负责各个设备的协调工作。就是把复杂的过程包装了一下
设计原则
The Principle of Least Knowledge
减少对象之间的内在关系。
只和最亲近的朋友交流。
在设计时,对于任何的类,都要注意和它所影响饿类的数量以及是如何影响其他的类的。
避免大量类之间耦合。
//没有遵循最少知识原则
Thermometer thermometer = station.getThermomter();
reutrn thermoeter.getTemperature();
//遵循原则的设计
//在station类中天街getTemperature()方法,减少耦合。
return station.getTempetature();