适配器模式之类适配器与对象适配器的区别及代码实现

标签: 适配器模式 类适配器 对象适配器 设计模式
12人阅读 评论(0) 收藏 举报
分类:

什么是适配器模式?

适配器模式(Adapter):直观理解就是使原来不能一起相互工作(接口不兼容)的两个功能通过Adapter兼容在一起。

类适配器和对象适配器

类适配器

Adapter 类继承Adaptee (被适配类),同时实现Target 接口(因为 Java 不支持多继承,所以只能通过接口的方法来实现多继承),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

对象适配器

不使用多继承或继承的方式,而是使用直接关联,或者称为委托的方式。

区别

类适配器的重点在于类,是通过构造一个继承Adaptee类来实现适配器的功能;
对象适配器的重点在于对象,是通过在直接包含Adaptee类来实现的,当需要调用特殊功能的时候直接使用Adapter中包含的那个Adaptee对象来调用特殊功能的方法即可。

Demo

类适配器

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
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();
    }
}

测试结果:
普通类 具有普通功能…
被适配类 具有特殊功能…

查看评论

“装饰者模式”和“对象适配器模式”异同

这两种模式在Java IO包下应用很多 典型的包装者模式:InputStream ---> FilterInputStream ---> InputStream 典型的适配器模式:Read...
  • masfay
  • masfay
  • 2013-09-23 09:55:01
  • 1538

类适配器与对象适配器的区别

适配器的目的是将已有类的功能提供给客户类,是一个中间者的角色。类适配器是客户类有一个接口规范的情况下可用,此时适配类只需作为功能类的子类,并实现接口并可,直接用功能类实现了客户类的要求。而对象适配类是...
  • cyai
  • cyai
  • 2007-10-15 21:24:00
  • 4278

适配器模式----类适配和对象适配

From:http://blog.csdn.net/t12x3456/article/details/7664764 为什么需要适配器模式? 在软件系统中,由于应用环境的变化,常常需要...
  • wuqilianga
  • wuqilianga
  • 2016-04-02 22:04:46
  • 2800

适配器模式之类的适配器模式与对象的适配器模式

适配器模式有类的适配器模式和对象的适配器模式两种不同的形式,如下图所示,左边是类的适配器模式,右边是对象的适配器模式。 类的适配器模式: 以下是uml类图: 模式所涉及的角色有: *目标(Targ...
  • u012734441
  • u012734441
  • 2015-05-03 15:59:28
  • 1342

解析简单工厂模式和适配器模式

简单工厂模式通俗来说,不直接new对象,而是让工厂类去new实例对象。 以手机工厂为例,一个手机工厂可以生产Iphone,也可以生产AndoridPhone,也可以产生OtherPhone。 实现步骤...
  • BigWind3
  • BigWind3
  • 2016-09-11 14:45:10
  • 1209

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...
  • lulei9876
  • lulei9876
  • 2014-10-14 10:55:01
  • 13967

装饰者模式、桥接模式、适配器模式

在开发过程中,为了扩展一个类的功能我们通常使用继承一个子类来实现。但是当扩展的功能过多时,则可能出现子类过多,类图过于膨胀。所以我们使用装饰者模式来避免这个问题。 装饰者模式提供了一种给一个类添加职...
  • Alexander_Frank
  • Alexander_Frank
  • 2016-05-09 21:51:54
  • 1615

Java适配器模式、代理模式及动态代理

适配器模式和代理模式表面上看来都是通过添加中间层来解除紧耦合的问题,那么这两种模式有什么区别呢,刚学不久的人真心会感到混乱。        适配器模式主要解决的是接口的兼容性问题,比如有A、B两个接口...
  • hust_dxxxd
  • hust_dxxxd
  • 2016-03-05 16:37:28
  • 723

设计模式:适配器模式(Adapter)

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。  适配器模式有类适配器模式和对象适配器模式两种不同的形式。 类适配器 ...
  • u013256816
  • u013256816
  • 2016-03-28 18:56:23
  • 3489

Design Pattern: 策略模式和适配器模式

策略模式用于抽象对于同一个对象的不同处理方式,把相同处理方式(内部状态)抽象成一个类,通过策略选择类选择产生对应的策略来处理输入的对象。 换个角度想想,其实策略模式需要结合简单工厂模式一起使用,是...
  • Firehotest
  • Firehotest
  • 2016-10-02 10:12:02
  • 1238
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 782
    排名: 6万+
    博客专栏
    最新评论