设计模式之适配器模式
2018-05-16 本文已影响18人
于无声处写写写
定义
将一个类的接口,转换成客户希望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
类图示例
image.png生活举例
欧洲的电压跟中国的电压是不一样的,因此去欧洲旅行想要用欧洲的插座充电的话,就需要一个转换头。这个转换头所充当的其实就是适配器。欧洲的插座充当的就是被适配者,中国的标准电压就是目标。
几个概念
- 客户:是依据目标接口实现的。
- 适配器:适配器实现了目标接口,并持有被适配者的实例。
- 被适配者:要进行转换的一方角色
客户和被适配者是解耦的,相互之间不知道彼此
客户使用适配器的过程
- 客户通过目标接口调用适配器的方法对适配器发出请求
- 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
- 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用
代码举例
首先我们实现一个鸭子的接口,该接口中有quauk()和fly()两种方法
package adapterpattern;
public interface Duck {
public void quack();
public void fly();
}
接着创建一个绿头鸭子类,实现Duck接口
package adapterpattern;
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("quack");
}
@Override
public void fly() {
System.out.println("fly");
}
}
实现一个火鸡的接口,里面有gobble()和fly()两个方法
package adapterpattern;
public interface Turkey {
public void gobble();
public void fly();
}
创建一个野生火鸡类,该类实现了火鸡接口中的方法
package adapterpattern;
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("turkey fly");
}
}
现在想要用火鸡对象来冒充鸭子对象,但是因为火鸡和鸭子的接口不同,不能公然拿来用,所以此时需要写一个适配器
按照上文中的创建适配器过程,将进行以下步骤
package adapterpattern;
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey=turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
创建一个测试类
package adapterpattern;
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck=new MallardDuck();//先创建一只鸭子
WildTurkey turkey=new WildTurkey();//和一只火鸡
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says..");
turkey.gobble();
turkey.fly();
System.out.println("The duck says...");
testDuck(duck);
System.out.println("TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
运行结果