参考:
- headfirst设计模式
适配器模式的解释:将一个接口转换成另一个接口,以符合客户的期望。
比如欧洲标准的三脚电源插座和美国的,中国的都不一样。如果你买了一台mac pro,很可惜,一般的三脚插座不一定能够插的进去。这个时候就需要一个转换头,这个转换头就是适配器。
代码实现
第一章里面讲到的鸭子,这里拿过来利用一下:
这只鸭子会飞,会叫
public interface Duck {
public void fly();
public void quack();
}
实现一只鸭子:
public class MallardDuck implements Duck {
@Override
public void fly() {
System.out.println("i believe i can fly");
}
@Override
public void quack() {
System.out.println("嘎嘎嘎嘎~~~");
}
}
这时候来了一只火鸡,火鸡也可以飞,也可以叫:
public interface TurKey {
public void fly();
public void gobble();
}
实现一只火鸡
public class WildTurKey implements TurKey {
@Override
public void fly() {
System.out.println("我要飞得更高");
}
@Override
public void gobble() {
System.out.println("咕咕咕咕咕");
}
}
好了,一只火鸡闯入了一群鸭子的底盘,为了不被打死,它决定伪装成一只鸭子。那么怎么做?
重点是要实现想要转换成的对象,就是来一个类,伪装成鸭子。
public class TurKeyAdapter implements Duck {
TurKey turKey;
public TurKeyAdapter(TurKey turKey) {
this.turKey = turKey;
}
@Override
public void fly() {
turKey.fly();
}
@Override
public void quack() {
turKey.gobble();
}
}
测试一下:
@Test
public void test(){
//来一只鸭子
MallardDuck duck = new MallardDuck();
//来一只火鸡
WildTurKey wildTurKey = new WildTurKey();
//伪装成,看起来像一只鸭子
Duck adapter = new TurKeyAdapter(wildTurKey);
//测试是否是一直鸭子
testDuck(duck);
testDuck(adapter);
}
void testDuck(Duck duck){
duck.quack();
duck.fly();
}
打印:
嘎嘎嘎嘎~~~
i believe i can fly
咕咕咕咕咕
我要飞得更高
总结一下
适配器是实现了目标接口(鸭子)的一个实例,这个实例持有被适配者(火鸡)的引用,在实现目标接口的方法时,使用被适配者的方法代替,附加一些额外的处理逻辑。
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。