(13)适配器模式

定义:(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

类型:结构类型模式

类图:

类的适配器模式(采用继承实现)

对象适配器模式(采用对象组合方式实现)

代码实现:

类的适配器模式

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
    public void specificRequest() {
        System.out.println("被适配类具有 特殊功能...");
    }
} 
// 目标接口,或称为标准接口
interface Target {
    public void request();
} 
// 具体目标类,只提供普通功能
class ConcreteTarget implements Target {
    public void request() {
        System.out.println("普通类 具有 普通功能...");
    }
} 
// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
    public void request() {
        super.specificRequest();
    }
}
// 测试类
public class Client {
public static void main(String[] args) {
        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request(); 

        // 使用特殊功能类,即适配类
        Target adapter = new Adapter();
        adapter.request();
    }
} 

运行结果:

普通类 具有 普通功能...
被适配类具有 特殊功能...

对象适配器模式

// 适配器类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
    // 直接关联被适配类
    private Adaptee adaptee; 

    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    } 

    public void request() {
        // 这里是使用委托的方式完成特殊功能
        this.adaptee.specificRequest();
    }
}
// 测试类
public class Client {
    public static void main(String[] args) {
        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request(); 

        // 使用特殊功能类,即适配类,
        // 需要先创建一个被适配类的对象作为参数
        Target adapter = new Adapter(new Adaptee());
        adapter.request();
    }
} 

测试结果与上面的一致。

适配器模式的优点:

l  通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

l  复用了现存的类,解决了现存类和复用环境要求不一致的问题。

l  将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

l  一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

适配器模式的缺点:

l  对于对象适配器来说,更换适配器的实现过程比较复杂。

适用场景:

l  系统需要使用现有的类,而这些类的接口不符合系统的接口。

l  想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

l  两个类所做的事情相同或相似,但是具有不同接口的时候。

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

l  使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

注意事项:

l  适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中,就像我们上面的那个例子一样,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。

l  再次提醒一点,项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场合下,也会带来非常大的改造。

时间: 2024-10-25 09:13:38

(13)适配器模式的相关文章

大话设计模式读书笔记--13.适配器模式

定义 适配器模式定义: 将一个类的接口转换成客户希望的另一个接口, 使得原本由于接口不兼容不能再一起工作的类,可以在一起工作 需要的东西就在眼前,但却不能使用,短时间内无非改造,于是我们就想办法适配它 例如: 一些国家的电压是不同的, 但是笔记本电脑通过电源适配器,都能把电源变成需要的电压 模式结构 Target: 客户期待的接口,可以是抽象类或者接口 Adapter: 在内部包装一个Adeptee对象,把原接口转为目标接口 Adeptee: 需要适配的类 代码实现 场景: 刚到NBA打球的姚明

程序员怎样迈出从5K到1W的重要一步

为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自己将代码改了又改,删了又建,几乎晕厥,最后只能推翻重来. 为什么大牛写完的程序测试上线后,几乎完美运行,用户无懈可击:而自己的程序bug重重,改好一个却又引出另一个,按下葫芦浮起瓢,几近崩溃. 为什么同样是程序员,大牛工资1W,而自己只能拿区区的3K? 大牛显然知道一些小菜所不知道的秘密,这秘密又是什么呢? 这个秘密就是设计模式.设

初识设计模式、软件设计的六大原则

总结:本篇文字分为两个部分.第一部分:设计模式基本常识:第二部分:软件设计中的六大原则,并详细分析了单一职责原则.(本篇文章的时间轴参考:为知笔记支撑文件夹\Java设计模式(时间序列图).vsdx) 部分一:初识设计模式 什么是设计模式?James拿到这个论点时,很是迷惑! 模式?是不是一个模子?模式识别--计算机领域的经典问题? 设计模拟?软件的设计模式?不懂!!! 但是在实际编码.调试过程中,James的遇到过很是难解的问题:工程代码中有过多的冗余代码--代码复用性不高:需求一旦改变,需要

23种设计模式对比与总结

设计模式总结:便于快速查看 前言:个人觉得设计模式就是各个对象在不同的时机.不同的调用方被创建,组合结构和封装的侧重点有些不同,从而形成了各个模式的概念. 1.      简单工厂模式 通过在工厂类中进行判断,然后创建需要的功能类. 优点:不必使用具体的功能类去创建该类的实例.缺点:新增一个功能类就需要在工厂类中增加一个判断. 2.      策略模式 假设一个功能类是一个策略,调用的时候需要创建这个策略的实例,传进一个类似策略控制中心的方法中,然后通过策略基类调用这个传进去的实例子类的方法.

小菜技术脱变

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自己将代码改了又改,删了又建,几乎晕厥,最后只能推翻重来. 为什么大牛写完的程序测试上线后,几乎完美运行,用户无懈可击:而自己的程序bug重重,改好一个却又引出另一个,按下葫芦浮起瓢,几近崩溃. 为什么同样是程序员,大牛工资1W,而自己只能拿区区的3K? 大牛显然知道一些小菜所不知道的秘密,这秘密又是

Javascript 部分设计模式的个人理解

9 单例模式(确保自己使用的资源都是全局的) 1)普通单体(字面量初始化对象) var person = { name : 'zhangsan', age : 12, getAge : function(){ return this.age ; } } person.height = 185 ; 这种单体在实际开发中常用在两个地方,其一就是 匿名对象,其二就是 划分命名空间! 2 )具有局部变量的单体(动态加载数据,初始化属性,返回一个对象实例)  var UserInfo = (functio

C++——设计模式说明

一.设计模式6大原则 名称 解释0.单一职责原则(SRP) 就一个类而言,应该仅有一个引起它变化的原因.一."开放-封闭"原则(OCP) 在软件设计模式中,这种不能修改,但可以扩展的思想也是最重要的一种设计原则.即软件实体(类.模板.函数等等)应该可以扩展,但是不可修改. [通俗]:设计的时候,时刻考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动.二.里氏代换原则(LSP) 1.一个软件实体如果使用的是一个父类的话,那么一定

java23种设计模式提纲

设计模式的六大原则: 1.单一职责原则 There should never be more than one reason for a class to change. 2.接口隔离原则 Clients should not be forced to depend upon interfaces that they don't use. The dependency of one class to another one should depend on the smallest possib

设计模式笔记——设计模式概念总结

设计模式基本概念总结 1.简单工厂模式(Static Factory Method) 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 2.策略模式(Strategy) 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 3.装饰模式 装饰模式(Decorator), 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.

迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自己将代码改了又改,删了又建,几乎晕厥,最后只能推翻重来. 为什么大牛写完的程序测试上线后,几乎完美运行,用户无懈可击:而自己的程序bug重重,改好一个却又引出另一个,按下葫芦浮起瓢,几近崩溃. 为什么同样是程序员,大牛工资1W,而自己只能拿区区的3K? 大牛显然知道一些小菜所不知道的秘密,这秘密又是