您的位置:首页 > 其它

设计模式:适配器模式

2018-03-16 17:24 274 查看
 适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不见人的类可以合作无间。  在生活中,一个二插转换器就是一个适配器,本来不能将二插的插头插入三插插口,利用了这个转换器就可以实现,这个二插转换器在中间起到了一端连接插座,一端连接插头的作用。  场景:之前我们看过鸭子Duck类,现在我们有个火鸡,让我们通过适配器把它伪装成鸭子。  首先创建鸭子和火鸡接口
//鸭子接口
public interface Duck {
//简单点,直接让鸭子具有呱呱叫和飞行能力
public void quack();
public void fly();
}

//火鸡接口
public interface Turkey {
//火鸡不会呱呱叫,只会咯咯叫
public void gobble();
//火鸡也能飞,但飞不远
public void fly();
}

  接着实现具体的鸭子和火鸡
//实现Duck接口的具体类,绿头鸭
public class MallardDuck implements Duck{

@Override
public void quack() {
System.out.println("Quack");
}

@Override
public void fly() {
System.out.println("I'm fly");
}
}

//实现火鸡接口的具体类
public class WildTurkey implements Turkey {

@Override
public void gobble() {
System.out.println("Gobble gobble");
}

@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}

  实现一个火鸡和鸭子连接的适配器
//实现向转换成的类型接口,也就是客户所希望看到的接口
public class TurkeyAdapter implements Duck{

Turkey turkey;

//需要取得要适配的对象引用,这里为了方便直接用构造器来取得这个引用
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}

@Override
public void quack() {
//把火鸡的咯咯叫伪装成鸭子的quack叫声
turkey.gobble();
}

@Override
public void fly() {
//因为火鸡飞不远,为了将火鸡的飞行伪装成鸭子的飞行,让火鸡多飞几次
for(int i=0; i<5; i++){
turkey.fly();
}
}
}

  最后编写测试类
public class Test {
public static void main(String[] args) {
//创建一直鸭子和火鸡
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();

//将火鸡保证金一个火鸡适配配,伪装成鸭子
Duck turkeyAdapter = new TurkeyAdapter(turkey);

System.out.println("----Test Turkey----");
//测试真正火鸡的行为
turkey.gobble();
turkey.fly();

//测试鸭子的行为,包括伪装成鸭子的火鸡
System.out.println("----Test Duck----");
testDuck(turkeyAdapter);
testDuck(duck);
}

public static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}

  运行结果如下:

  下面总结下客户使用适配器的过程。    1:客户(鸭子)通过目标接口调用适配器的方法对适配器发出请求。    2:适配器使用被适配者接口(火鸡接口)把请求转换成被适配者的一个或多个调用接口(具体的火鸡接口实现类)。    3:客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。  好了,这就是简单的适配器例子了。   下一节:外观模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式