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

适配器模式:双向适配器

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

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);
    }   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值