简说适配器模式

设计模式之适配器模式

定义

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。 —— [ 百度百科 ]

分类

  • 类适配器模式
  • 对象适配器模式
  • 缺省适配器模式

解释说明

类适配器模式
类适配器模式,通过继承服务器一方的类,拥有了提供服务器服务的功能,同时又实现了客户端请求服务的接口,得以将客户端请求服务的功能,转嫁给服务器提供的服务。
代码块
public class Test {
    //客户端请求服务的外部接口
    interface StrongMan{
        public void doWork();

    }
    //服务端提供服务的类
    class YoungMan{
        public void doEasyWork(){
            System.out.println("搬一块砖");
        }
    }
    //适配器类
    class Adapter extends YoungMan implements StrongMan{
        @Override
        public void doWork() {
            super.doEasyWork();         
        }       
    }
    //测试
    public static void main(String[] args) {
        //实例化原型
        Adapter adapter = new Test().new Adapter();
        adapter.doWork();
    }
}

: 以上就是类适配器模式的完整代码。StrongMan接口是客户端请求服务的接口,但是服务端提供服务的YoungMan类,并不能跟客户端的请求相匹配。所以,就需要一个适配器类,继承YoungMan类拥有doEasyWork的方法,然后再实现StrongMan类,讲父类的方法doEasyWork封装到doWork中,这就实现了客户端请求服务,与服务端提供服务接口不一致的情况。

对象适配器模式
对象适配器模式中,我们将服务端提供服务的类对象内置于适配器类中,直接在其中获取服务端提供的服务
public class Test {
    //客户端请求服务的外部接口
    interface StrongMan{
        public void doWork();

    }
    //服务端提供服务的类
    class YoungMan{
        public void doEasyWork(){
            System.out.println("搬一块砖");
        }
    }
    //适配器类
    class Adapter implements StrongMan{
        private YoungMan youngMan = new YoungMan();
        @Override
        public void doWork() {
            youngMan.doEasyWork();          
        }       
    }
    //测试
    public static void main(String[] args) {
        //实例化原型
        Adapter adapter = new Test().new Adapter();
        adapter.doWork();
    }
}

: 以上就是对象适配器的完整代码示例。适配器类Adapter不在继承服务端提供服务的类(YoungMan)了,而是将服务类,直接内置于适配器类中,直接获取服务。

缺省适配器模式
缺省适配器模式中,如果我们的适配器类不想实现外部接口定义的所有的方法的时候,那么可以在适配器类与接口之间创建一个抽象类,由抽象类去平庸化接口中的方法。
public class Test {
    //客户端请求服务的外部接口
    interface StrongMan{
        public void doWork();
        public void eat();
        public void say();      
    }
    //客户端接口抽象类
    abstract class AbstractStrongMan implements StrongMan{
        @Override
        public void doWork() {
        }
        @Override
        public void eat() {
        }
        @Override
        public void say() {
        }
    }
    //服务端提供服务的类
    class YoungMan{
        public void doEasyWork(){
            System.out.println("搬一块砖");
        }
    }
    //适配器类
    class Adapter extends AbstractStrongMan{
        private YoungMan youngMan = new YoungMan();
        @Override
        public void doWork() {
            youngMan.doEasyWork();
        }       
    }
    //测试
    public static void main(String[] args) {
        //实例化原型
        Adapter adapter = new Test().new Adapter();
        adapter.doWork();
    }
}

: 以上就是缺省适配器的完整代码示例。我们在客户端请求服务的接口StrongMan与适配器类Adapter中间创建一个抽象类,抽象类去实现不希望适配器实现的功能,那么我们的适配器的功能就变得更具有目标性。

总结

优点
  1. 更好的复用性
    系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

  2. 更好的扩展性
    在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

缺点
  1. 过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
试用场景
  1. 已经存在的类的接口不符合我们的需求;

  2. 创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作;

  3. 使用一些已经存在的子类而不需要对其进行子类化来匹配接口。

  4. 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值