java设计模式——适配器模式三

来源:互联网 发布:房产经纪人用什么端口 编辑:程序博客网 时间:2024/05/18 01:44

适配器模式:双向适配器

介绍:由名字可知,该适配器既可以将目标接口适配成被适配者,也可以将被适配者适配成目标接口(前者其实只是将目标接口与被适配者接口角色互换)
定义:在对象适配器的使用过程中,如果在适配器中同时包含对目标类和适配者类的对象引用(即同时依赖于被适配者类和目标接口),适配者可以通过调用目标接口中的方法,目标接口也可以通过它调用适配者类中的方法,那么该适配器就是一个双向适配器。
以下是关于双向适配器的代码示例:

public interface Duck   //目标接口(因为在双向适配器模式的情况下,所以他同时也是被适配者){    public void quack();    public void Dfly();}public class ConcreteDuck implements Duck       //目标接口的具体实现类(也可以说是被适配者接口的具体实现类——因为他可以有两种不同的角色:被适配者或者接口){    public void quack() {        System.out.println("我是一个真正的鸭子");    }    public void Dfly() {        int distance=100;        System.out.println("我能飞行"+distance+"米");    }  }public interface Turkey {       //被适配者类(同时也可以是目标接口类)    public void speak();    public void Tfly();}public class wildturkey implements Turkey{    public void speak() {       System.out.println("我是一个火鸡");    }    public void Tfly() {        int distance=20;        System.out.println("我只能飞行"+distance+"米");    }}public class adapter implements Duck,Turkey         //双向适配器,既实现了目标接口,又实现了被适配者接口(其实也是目标接口){                       //注意:适配器类只实现目标接口(因为双向适配器,便于区分:所以说其既实现了目标接口,又实现了被适配者接口(其实被适配者接口也是目标接口))    Duck duck;    Turkey turkey;    public adapter(Duck duck)           //此时代表turkey接口是目标接口,将duck对象进行适配    {        this.duck=duck;    }    public void quack() {        duck.quack();    }    public void Dfly() {        duck.Dfly();        System.out.println("我能飞行上述距离的五分之一");       //将duck适配成火鸡后们需要将其fly方法进行修改,使其实现目标接口(turkey)的飞行距离(包装——给duck穿上了turkey的衣服)    }    public adapter(Turkey turkey)           //此时代表duck接口是目标接口,将turkey对象进行适配    {        this.turkey=turkey;    }    public void speak()    {        turkey.speak();    }    public void Tfly()    {        turkey.Tfly();        System.out.println("我能飞行上述距离的5倍");            //将火鸡适配成duck后,需要将其fly方法进行修改,使实现目标接口(duck)的飞行距离(包装——给turkey穿上了duck的衣服)    }}public class client {           //客户类,通过客户与目标接口进行交互(客户类不与被适配者类直接交互)    public void testturkey(Turkey turkey)       //说明客户想要测试turkey类    {        turkey.Tfly();        turkey.speak();    }    public void testduck(Duck duck)     //说明客户想要测试duck类    {        duck.Dfly();        duck.quack();    }}public class test {    public static void main(String[] args) {        // TODO code application logic here        ConcreteDuck duck=new ConcreteDuck();       //创建一个具体的鸭子对象        wildturkey turkey=new wildturkey();         //创建一个具体的鸭子对象        adapter aaa=new adapter(duck);              //将duck适配称火鸡        adapter bbb=new adapter(turkey);            //将火鸡适配成了duck        client ccc=new client();                    //创建一个客户对象,根据客户需要调用鸭子还是火鸡(还是将两者进行适配后调用)        ccc.testduck(aaa);        System.out.println();        ccc.testturkey(bbb);    }   }