适配器模式

适配器的定义

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器的种类

对象适配器模式


用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。

类适配器模式


允许一个Adapter与多个Adaptee—即Adaptee本身以及它的所有子类(如果有子类的话)—同时工作。Adapter也可以一次给所有的Adaptee添加功能。

结构

目标角色(Target):— 定义Client使用的与特定领域相关的接口。
客户角色(Client):与符合Target接口的对象协同。
被适配橘色(Adaptee):定义一个已经存在并已经使用的接口,这个接口需要适配。
适配器角色(Adapte) :适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口。对Adaptee的接口与Target接口进行适配.

适配器的在生活中的应用

1.电视接口可以接受不同的音质,能够匹配不同的放映机,原来是DVD的机子,后来结成adapter之后可以匹配CD的放映,只要更改适配的代码,而不用修改全部
2.电脑pc的接口,可以插U盘和连接手机,还可以连接充电,这就是在原有的传输数据的基础上,适配充电的功能,然后可以重载不同的方法接口,连接不同的终端接口,在还可以连接打印机等其他的设备,这根据适配器,能够减少依赖,降低耦合度,便于开发和维护

适配器模式使用注意事项

充当适配器角色的类就是:实现已有接口的抽象类;
为什么要用抽象类?此类是不要被实例化的。而只充当适配器的角色,也就为其子类提供了一个共同的接口,但其子类又可以将精力只集中在其感兴趣的地方。
适配器模式中被适配的接口 Adaptee 和适配成为的接口 Target 是没有关联的,Adaptee 和 Target 中的方法既可以是相同的,也可以是不同的。
适配器在适配的时候,可以适配多个 Apaptee,也就是说实现某个新的 Target 的功能的时候,需要调用多个模块的功能,适配多个模块的功能才能满足新接口的要求。
适配器有一个潜在的问题,就是被适配的对象不再兼容 Adaptee 的接口,因为适配器只是实现了 Target 的接口。这导致并不是所有 Adaptee 对象可以被使用的地方都能是使用适配器,双向适配器解决了这个问题

代码实现

package adaptertest;

public interface Duck {
    public void quack();
    public void fly();

}

实现接口

package adaptertest;

public class MallardDuck implements Duck {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Quack");
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I am flying");
    }

}
package adaptertest;

public interface Turkey {
    public void gobble();
    public void fly();


}
package adaptertest;

public class WildTurkey implements Turkey{

    @Override
    public void gobble() {
        // TODO Auto-generated method stub
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I am flying a short distance");

    }

}

实现

package adaptertest;

public class WildTurkey implements Turkey{

    @Override
    public void gobble() {
        // TODO Auto-generated method stub
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        System.out.println("I am flying a short distance");

    }

}

适配器实现

package adaptertest;

public class TurkeyAdapter implements Duck {
Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
    super();
    this.turkey = turkey;
}

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        turkey.gobble();
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        for(int i=0;i<5;i++)    {
            turkey.fly();
        }
    }

}

测试

package adaptertest;

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("\n The Duck says...");
        testDuck(duck);
        System.out.println("\n The TurkeyAdapter says...");
        testDuck(turkeyAdapter);
    }

    private static void testDuck(Duck duck) {
        // TODO Auto-generated method stub
        duck.fly();
        duck.quack();

    }

}

结果:
the Turkey says…
Gobble gobble
I am flying a short distance

The Duck says…
I am flying
Quack

The TurkeyAdapter says…
I am flying a short distance
I am flying a short distance
I am flying a short distance
I am flying a short distance
I am flying a short distance
Gobble gobble

总结

通过本模式,可以锻炼一种解决方法的途径,不用一直死坑到底,当遇到困难时候,换一个方法去接应原来的方法估计更加完美,就像你要画一个圆,直接画的画你捉不住方向,这时候你可以像画一个正方形,然后慢慢的去掉四个边,然后慢慢磨平棱角,这样你的把握会更加的完美,这就是学习和生活的区别吧,不过学习的模式就是生活方法和经验的总结。加油,GO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值