Structual设计--Adapter模式

1.意图

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

2.别名

包装器Wrapper。

3.动机

有时,为复用而设计的工具箱类不能够被复用原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。具体场景可以描述为:基础功能类–》adapter专业接口–》专业调用,其中基础功能类可以理解为我们常见的jdk,也可以是一些sdk或者一些平台支持类。

4.适用性

以下情况使用Adapter模式

  • 你想使用一个已经存在的类,而它的接口不符合你的要求
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以是适配它的父类接口。

5.结构

类适配器使用多重继承对一个接口与另一个接口进行匹配,如下图所示,旨在让Targetable具有Source类功能,本身不对Source类做操作:

对象适配器依赖于对象组合,如下图所示,思路和类适配器是一样的,只是这里不再继承Source类,而是持有Source类对象的实例,以达到解决兼容性问题。

6.代码示例

类适配器代码:

Source类

public class Source {

    public void method1() {
        System.out.println("this is original method!");
    }
}

Targetable类

public interface Targetable {

    /* 与原类中的方法相同 */
    public void method1();

    /* 新类的方法 */
    public void method2();
}

适配器adapter类

public class Adapter extends Source implements Targetable {

    @Override
    public void method2() {
        System.out.println("this is the targetable method!");
    }
}

Adapter类继承Source类,实现Targetable接口,下面是测试类:

public class AdapterTest {

    public static void main(String[] args) {
        Targetable target = new Adapter();
        target.method1();
        target.method2();
    }
}

输出结果:

this is original method!

this is the targetable method!

这样Targetable接口的实现类就具有了Source类的功能。

类对象适配器代码:

只需要修改Adapter类的源码即可:

public class Wrapper implements Targetable {

    private Source source;

    public Wrapper(Source source){
        super();
        this.source = source;
    }
    @Override
    public void method2() {
        System.out.println("this is the targetable method!");
    }

    @Override
    public void method1() {
        source.method1();
    }
}

测试类:

public class AdapterTest {

    public static void main(String[] args) {
        Source source = new Source();
        Targetable target = new Wrapper(source);
        target.method1();
        target.method2();
    }
}

输出与第一种一样,只是适配的方法不同而已。

7.相关模式

模式Bridge的结构与对象适配器类似,但是Bridge模式的出发点不同:Bridge目的是将接口部分和实现部分分离,从而对他们可以较为容易也相对独立的加以改变。而Adapter则意味着改变一个已有对象的接口。

Decorator模式增加了其他对象的功能而同时又不改变他的接口。因此decorator对应用应用程序的透明性比适配器要好。结果是decorator支持递归组合,而纯粹使用适配器是不可能实现这一点的。

模式Proxy在不改变它的接口的条件下,为另一个对象定义了一个代理。

引用:

http://item.jd.com/10057319.html

http://blog.csdn.net/zhangerqing/article/details/8239539

时间: 2024-12-06 12:50:37

Structual设计--Adapter模式的相关文章

Structual设计--Proxy 模式

1.意图 为其他对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate 3.动机 对一个对象进行访问控制的一个愿意是为了只有在我们确实需要这个对象时才对他进行创建和初始化.譬如手机上加载图片,每一个屏幕的大小是有限定的,我们无需每次把所有图片都加载上,只有在需要展示的时候才对图片进行创建和初始化. 4.适用性 在需要用比较通用和复杂的对象指针代理简单的指针的时候,使用Proxy.下面是一些可以使用Proxy模式常见的情况: 远程代理(Remote Proxy)为一个对象在不同的地

Structual设计--Bridge模式

1.意图 将抽象部分与它的实现部分分离,使他们都可以独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通常用继承来协调它们.抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现.但是此方法有时不够灵活.继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改.扩充和重用. 4.适用性 以下情况使用Bridge模式: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以

Structual设计--Decorator 模式

1.意图 动态的给一个对象添加额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器Wrapper. 3.动机 有时,我们希望给某个对象而不是整个类添加一些功能.例如,肯德基推出特价套餐,如果套餐1中有:汉堡和鸡腿和价格,套餐二中有:薯条和汉堡和价格,如果做继承类,而且是多继承明显不够灵活,那么就需要装饰类. 4.适用性 以下情况使用Decorator模式 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理他那些可以撤销的职责. 当不能采用

Structual设计--Flyweight模式

1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中采用对象技术,但简单化的实现代价极大.如我们在使用word的时候,如果设置正文字体为:text.setFont(new Font("細明體", Style.BOLD, 12));每一个文字我们都需要这样设置,内存太大,而且也非常难记,稍有不注意就会出错.所以通常并不是对每个字符都用一个单独的对象去表示.Flyweight模式描述了如何共享对象,是的可以细粒度地使用他们而无需高

Structual设计--Composite模式

1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.别名 无 3.动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表.用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件.一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container). 然而存在一个问题:使用这些类的代码必需区别对待图元对

Structual设计--Facade模式

1.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用. 2.别名 无 3.动机 将一个系统划成为若干个子系统有利于降低系统的复杂性.一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小.达到该目标的途径之一是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面.例如算法库有很多算法类,我们在使用的时候分别去调用,最后算法库的外部调用和算法之间的关系会变的错综复杂,这就需要我们引入facad

Adapter 模式

在实际软件系统设计和开发中,会经常遇到这种问题:我们为了完成某项工作购买了一个第三方的库来加快开发. 这就带来了一个问题: 我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类可以在一起工作,Adapter 模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口. 1 //////////////Adapter.h////////////////// 2 #pragma once 3 class Target 4 { 5 public: 6

敏捷软件开发 – ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式

设计运行在简易台灯中的软件.台灯由一个开关和一盏灯组成.可以询问开关是开着还是关着,也可以让灯打开或者关闭. 下面设计了一个简易的模型.Switch对象可以轮询实际开关的状态,并且可以发送相应的turnOn和turnOff消息给Light. 这个设计违反了两个设计原则:依赖倒置(DIP)和开放-封闭(OCP).对DIP的违反是明显的,Switch依赖了具体类Light.DIP告诉我们要优先依赖于抽象类.对OCP的违反虽然没有那么明显,但是更加切中要害.我们之所以不喜欢这个设计是因为它迫使我们在任

【结构型】Adapter模式

Adapter模式主要意图是将类或接口转换成客户期望的接口,从而使得原本不兼容.无法在一起工作的接口可以在一起工作.该模式有两种形式的Adapter法,一是继承方式:二是对象关联依赖方式. 继承方式Adapter法,相比之下,耦合性更强些,并且毕竟依赖于静态继承,如果被适配的对象有多个(派生)版本的话,则在运行时,将无法做到动态适配,因此,如果想要切换适配对象,就必需要重新编译链接.该方式的类关系参考如下: 就Adapter的目的来说,Adapter对象在使用目的上与被适配的Adaptee对象本