1.场景问题解决
1.1 场景描述
电源插头不适配,可以转换,需要适配器;火鸡和鸭子需要适配转换.
1.2 OO设计
1.3 需求变动
1.4 带来问题
2.用设计模式改进
2.1 分析
2.2 重新设计-对象适配器(构造方法传对象)
2.2.1 概述
类适配器:通过多重继承目标接口和被适配者类方式来实现适配,讲被适配的对象传进去(构造方法)
2.2.2 源码
火鸡和鸭子的适配器
- interface Duck和Turkey;适配器 TurkeyAdapter
public interface Duck {
public void quack();
public void fly();
}
public interface Turkey {
public void gobble();
public void fly();
}
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() {
for(int i=0;i<6;i++){
turkey.fly();
}
}
}
public class AdapterTest {
public static void main(String[] args) {
WildTurkey turkey=new WildTurkey();
Duck duckToturkeyAdapter=new TurkeyAdapter(turkey);
duckToturkeyAdapter.quack();
duckToturkeyAdapter.fly();
Duck duckToturkeyAdapter2=new TurkeyAdapter2();
duckToturkeyAdapter2.quack();
duckToturkeyAdapter2.fly();
}
}
2.3 重新设计-类适配器(继承类)
2.3.1 概述
多重继承,其中继承的目标接口部分达到适配目的,而继承被适配者类的部分达到通过调用被适配者类里的方法来实现目标接口的功能;将继承被适配的对象(TurkeyAdapter2 extends WildTurkey).
2.3.2 源码
public class TurkeyAdapter2 extends WildTurkey implements Duck {
@Override
public void quack() {
super.gobble();
}
@Override
public void fly() {
super.fly();
super.fly();
super.fly();
}
}
public class AdapterTest {
public static void main(String[] args) {
WildTurkey turkey=new WildTurkey();
Duck duckToturkeyAdapter=new TurkeyAdapter(turkey);
duckToturkeyAdapter.quack();
duckToturkeyAdapter.fly();
Duck duckToturkeyAdapter2=new TurkeyAdapter2();
duckToturkeyAdapter2.quack();
duckToturkeyAdapter2.fly();
}
}
3.设计模式总结
3.1 定义
适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容.
从用户的角度看不到被适配者,是解耦的
用户调用适配器转化出来的目标接口方法
适配器再调用被适配者的相关接口方法
用户收到反馈结果,感觉只是和目标接口交互
3.2 分析思路
对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承.
对象适配器代码多,类适配器代码少.
少用继承,多用组合,所以对象适配器更优.
4. 设计模式使用场景及注意
4.1 场景一
场景一: 枚举器到迭代器适配
4.2 场景一源码
import java.util.Enumeration;
import java.util.Iterator;
public class EnumerationIterator implements Iterator<Object> {
private Enumeration enumeration;
public EnumerationIterator(Enumeration enumeration)
{
this.enumeration= enumeration;
}
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public Object next() {
return enumeration.nextElement();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
4.2 装饰者模式与适配器模式区别
**装饰者模式: **装饰和被装饰的的是同一个超类,是一个类族的, 还可以互相嵌套. (如:IO流)
装饰者模式传入被装饰者对象,通过装饰者的类的功能转换出一个新的对外展现方式,
例:插座国标还是转国标,但是新的国标的功能增加了.
适配器模式: 适配的类和被适配的类是不同的类族的.是一种接口/类转换成另外一个接口/类.
例:插座国标转美标,或者转日标.
5.参考文章
内容总计于HeadFirst设计模式及相关视频