适配器模式 - 结构型模式

个人理解:    

模式类型:
    Adapter  适配器模式 - 结构型模式
    
意图:
     Convert the interface of a class into another interface clients expect.
    Adapter lets classes work together, that could not otherwise because of incompatible interfaces.

     将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。


概述:  
    在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。
    
    类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
    
角色:
    目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
    需要适配的类(Adaptee):需要适配的类或适配者类。
    适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

模式的应用场景:
    1、系统需要使用现有的类,而这些类的接口不符合系统的接口。
    2、想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
    3、两个类所做的事情相同或相似,但是具有不同接口的时候。
    4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
    5、使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

结构图:



模式的优缺点:
优点
    1、通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
    2、复用了现存的类,解决了现存类和复用环境要求不一致的问题。
    3、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
    4、一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点
    过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

适配器应用举例
    在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。(http://blog.csdn.net/adoocoke/article/details/8286902)
    

代码:

代码分2部分,第一部分是类适配器,第二部分是对象适配器。

1、类适配器


package com.lee.desingerPattener23.adapter.classAdapter;

interface Target {
	/**
	 * 这是源类Adaptee也有的方法
	 */
	public void sampleOperation1();

	/**
	 * 这是源类Adapteee没有的方法
	 */
	public void sampleOperation2();
}

class Adaptee {
	public void sampleOperation1() {}
}

public class Adapter extends Adaptee implements Target {
    /**
     * 由于源类Adaptee没有方法sampleOperation2()
     * 因此适配器补充上这个方法
     * 
     * 适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。由于Adaptee没有提供sampleOperation2()方法,
     * 而目标接口又要求这个方法,因此适配器角色Adapter实现了这个方法。
     */
    @Override
    public void sampleOperation2() {
        //写相关的代码
    }
    
}


2、对象适配器


package com.lee.desingerPattener23.adapter.objectAdapter;

interface Target {
    /**
     * 这是源类Adaptee也有的方法
     */
    public void sampleOperation1(); 
    /**
     * 这是源类Adapteee没有的方法
     */
    public void sampleOperation2(); 
}
class Adaptee {
    public void sampleOperation1(){}
}

public class Adapter implements Target {
	//此处用的是关联关系,减少耦合性
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    /**
     * 源类Adaptee有方法sampleOperation1
     * 因此适配器类直接委派即可
     */
    public void sampleOperation1(){
        this.adaptee.sampleOperation1();
    }
    /**
     * 源类Adaptee没有方法sampleOperation2
     * 因此由适配器类需要补充此方法
     */
    public void sampleOperation2(){
        //写相关的代码
    }
}



所有模式:
     创建型模式,共五种:工厂方法模式、抽象工厂模式单例模式建造者模式原型模式
结构型模式,共七种:适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式
    行为型模式,共十一种:策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式
    补充模式:空对象模式


参考/转自:
http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
http://www.oodesign.com/adapter-pattern.html

转载请注明: http://blog.csdn.net/paincupid/article/details/46884927
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值