适配器模式
定义
将一个类的接口,转换成客户端期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。分为:
- 对象适配器
被适配者作为一个实例(被适配者)组合到适配器中,用这个实例完成目标接口(适配者)的动作
- 类适配器 -多继承不适合java
适配器同时继承适配者与被适配者,用被被适配者的方法方式实现适配者的方法
案例
把火鸡适配成一只鸭子
让火鸡实现鸭子的叫唤和飞的动作。
/**
* 对象继承 :适配器实现目标接扣;将被适配者组合给适配器.
* 缺点: 必须实现目标接口所有方法。可是万一我只需要适配一个接口呢,那其他的接口也得强制实现
* 本来想 让其他不想实现的接口库置为private,这样外部就调不到了.但继承/实现 不能减少被继承者的范围,也就不能置为私有的。
*
*/
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.walk();
}
/*
Cannot reduce the visibility of the inherited method from Duck
@Override
private void fly(){
turkey.walk();
}
*/
}
枚举类适配成迭代器
但是这个使用场景是什么???
public class EnumerationIterator implements Iterator {
private Enumeration e ;
@Override
public boolean hasNext() {
return e.hasMoreElements();
}
@Override
public Object next() {
return e.nextElement();
}
@Override
public void remove() {
//因为被适配者Enumeration 没有remove()方法
throw new UnsupportedOperationException();
}
}
模式框架
外观模式
定义
定义一个统一的接口,用来访问子系统中的一群接口。外观接口定义了一个高层接口,让系统更容易访问,而且可以让客户从系统的组件中解耦。
最少知识原则
只和你的密友谈话。即,希望在我们的设计中,不要让太多的类耦合在一起,免得修改系统的一部分,会影响很多部分。增加维护成本。
例如:
public float getTempt(){
Thermometer t = station.getThermometer();
return t.getTrmperature();
}
public float getTempt(){
return station.getTrmperature();//需要在station类中增添该方法
}
利用该规则设计好处是 解耦,缺点是更多的“包装”类、风阀被制造出来,增加开发复杂度和时间。
装饰者与适配器的比较
装饰者是将一些新的行为加入进来
适配器是将原有的接口转化成赢一个接口,并增加或者减少自己的功能。
适配器与外观的比较
外观和适配器都可以包装很多类,但外观的意图是简化接口,方便客户访问子系统;而适配器的意图是将接口转换成其他接口。