适配器模式-Adapter Pattern

本文介绍了适配器模式的概念及应用场景,旨在解决现有类接口与系统需求不匹配的问题。通过继承或依赖的方式,使原本不兼容的类能够协同工作。
意图:

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

主要解决:

主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用:
  1. 系统需要使用现有的类,而此类的接口不符合系统的需要。
  2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
  3. 通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
如何解决:

继承或依赖(推荐)。

关键代码:

适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例:
  1. 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  2. JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
  3. 在 LINUX 上运行 WINDOWS 程序。
  4. JAVA 中的 jdbc。
优点:
  1. 可以让任何两个没有关联的类一起运行。
  2. 提高了类的复用。
  3. 增加了类的透明度。
  4. 灵活性好。
缺点:
  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
使用场景:

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

通用类图:

适配器模式

通用源码:

目标角色

public interface Target {
    //目标角色有自己的方法
    public void request();
}

目标角色的实现类

public class ConcreteTarget implements Target {
    public void request() {
        System.out.println("if you need any help,pls call me!"); 
    }
}

源角色

public class Adaptee {
    //原有的业务逻辑
    public void doSomething(){
        System.out.println("I'm kind of busy,leave me alone,pls!");
    }
}

适配器角色

public class Adapter extends Adaptee implements Target {
    public void request() {
        super.doSomething();
    }
}

转载来源:
http://www.runoob.com/design-pattern/adapter-pattern.html
http://www.uml.org.cn/oobject/201404035.asp

适配器模式Adapter Pattern)主要是为了使两个原本不兼容的接口能够协同工作。它用于解决由于接口不匹配导致的问题,比如现有系统使用了某种特定的接口或类,而新引入的技术需要另一种接口,这时适配器模式就发挥作用了。实际问题包括: 1. **兼容性问题**:新功能或库与现有系统接口不一致,无法直接集成。 2. **重构需求**:已有代码库难以修改,需要在不更改其原有接口的情况下增加新功能。 3. **第三方组件整合**:将外部库或产品无缝地融入到现有的架构中。 代码设计方面,适配器模式通常包含三个部分: 1. **目标接口**(Adaptee):原始接口或类,需要被适配以满足新的需求。 2. **适配器接口**(Adapter Interface):新系统期望的接口,用于与目标接口通信。 3. **适配器类**(Adapter Class):实现了适配器接口,内部包含了对目标接口的具体实例,并处理两者之间的转换。 示例代码可能如下所示: ```java // 原始接口 interface Target { void doSomething(); } // 目标接口 class Adaptee implements Target { @Override public void doSomething() { // 实现原始接口的方法 } } // 适配器类 class Adapter implements AdapterInterface { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void someNewMethod() { adaptee.doSomething(); // 调用Adaptee的原始方法 } } ``` 在这个例子中,`Adapter`就是一个适配器,它隐藏了`Adaptee`的细节,让外部看来就像可以直接调用`someNewMethod()`一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值