• 适配器模式

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

1. 类的适配器模式

  • 目标角色:期望的接口,对于类的适配器模式,此角色不可以是具体类。
  • 源角色:需要适配的接口。
  • 适配器角色:把源接口转换成目标接口,此角色必须是具体类。
public interface Target {

    void fun2();
}
public class Adaptee {

    public void fun1(){

    }
}
// 适配器Adapter扩展了Adaptee,同时也实现了接口Target。这样Adapter的类型是Adaptee同时也提供Target要求的方法。
public class Adapter extends Adaptee implements Target { @Override
public void fun2() {
// TODO Auto-generated method stub }
}

2. 对象的适配器模式

  • 目标角色:期望的接口,可以是具体或抽象的类。
  • 源角色: 需要适配的接口。
  • 适配器角色:把源接口转换成目标接口,此角色必须是具体类。
public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
} public void fun1(){
adaptee.fun1();
} @Override
public void fun2() {
// TODO Auto-generated method stub }
}

可以看出,对象适配器与类适配器的区别是使用对象组合代替了类型继承。这样一个适配器可以把多种不同的源适配器到同一个目标。但与类适配器相比,要想置换源类的方法就不太容易,如果一定要置换,可以先做好一个源类的子类置换掉方法,然后将子类当作真正的源进行适配。不过要是想增加一些新的方法则很方便,而且新增加的方法可以同时适用于所有的源。

  • 装饰器模式

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。

  • 抽象构建角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构建角色:定义一个将要接收附加责任的类。
  • 装饰角色:持有一个构建对象的实例,并定义一个与抽象构建接口一致的接口。
  • 具体装饰角色:负责给构建对象贴上附加的责任。

具体装饰角色实现了构建接口,对于每一个实现的方法都委派给父类的构建角色,关键在于它功能的增强,而不是单纯地委派。

  • 示例:IO设计

java api的io类库中对于适配器装饰器的应用随处可见,这里以读取文件为例,看一下其中的相关的几个类。

// 读取一个文件内容
BufferedReader in = new BufferedReader(new FileReader(new File("test.txt")));

BufferedReader是一个典型的装饰器模式,它实现了Reader接口,同时也拥有Reader子类的一个实例,这里也就是FileReader,然后将所有的读取任务都委托给了FileReader的实例,但是增加了缓存读取功能。

我们通常会说InputStreamReader是从byte输入流到char输入流的一个适配器,但其实起到适配器作用的是StreamDecoder,它拥有InputStream的实例同时实现了Reader接口,而InputStreamReader在此基础上进一步装饰了StreamDecoder。

说一个让java初学者纠结的一个问题,io流关闭问题:由于使用的装饰器模式,对于io流的close,我们只要调用最外层的close方法就可以了。比如BufferedReader会将close的操作委托给reader实例,这个实例正常是InputStreamReader的实现,然后InputStreamReader又委托给StreamDecoder,最后StreamDecoder又会委托给InputStream的实现类,最终实现了IO流关闭,反过来如果提前调用了委托类的close方法,那么上层的读取也会失败。

#笔记内容参考《java与模式》

java设计模式4.适配器模式、装饰器模式的更多相关文章

  1. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  2. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  3. JAVA设计模式之【装饰者模式】

    JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...

  4. Java IO流以及装饰器模式在其上的运用

    流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...

  5. 设计模式学习心得<装饰器模式 Decorator>

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...

  6. Java设计模式之四 ----- 适配器模式和桥接模式

    前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式.本篇则来学习下结构型模式的适配器模式和桥接模式. 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型 ...

  7. 设计模式入门之装饰器模式Decorator

    //装饰模式定义:动态地给一个对象加入一些额外的职责. //就添加功能来说.装饰模式比生成子类更为灵活 //这也提现了面向对象设计中的一条基本原则,即:尽量使用对象组合,而不是对象继承 //Compo ...

  8. java进阶系列之装饰器模式

    1.介绍 装饰器模式顾名思义就是装饰某个对象的,是一种结构型模式.装饰器模式允许向一个现有对象添加新的功能,同时不改变其结构,用户可以随意的扩展原有的对象.它是作为现有的类的一个包装.装饰器模式一方面 ...

  9. 设计模式のDecoratorPattern(装饰器模式)----结构模式

    一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  10. 适配器模式 & 装饰器模式

    一.适配器模式:简单来讲,就是为了方便使用,完成从 一个接口 到 另一个接口 的 转换,这个负责转换的就是 适配器例如:Reader ——> InputStreamReader 通过类内部组合 ...

随机推荐

  1. 提升10倍生产力:IDEA远程一键部署SpringBoot到Docker

    作者:陶章好 juejin.im/post/5d026212f265da1b8608828b 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容 ...

  2. Python(简单图形和文件处理)编程

    Python确实是一门很简洁而且功能有强大的语言,我觉得开始学习很容易理解,说到熟练和精通还是不容易的,还需不断学习. 从最基础的语法学习,有些部分各种语言是相同的,让人很好理解.编程也是从最简单语法 ...

  3. Spring WebClient vs. RestTemplate

    1. 简介 本教程中,我们将对比 Spring 的两种 Web 客户端实现 -- RestTemplate 和 Spring 5 中全新的 Reactive 替代方案 WebClient. 2. 阻塞 ...

  4. 编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时

    自定义 .Net Core 主机运行.Net Core代码,以及控制运行时运行状态,是在.Net Core 高级运行环境以及定制.Net Host ,CLR 等必不可少的. 这些设置包括为     1 ...

  5. Pyenv虚拟环境的创建(虚拟机)

    创建pyenv虚拟环境 sudo yum install openssl* 安装其所需要的库文件 git clone https://github.com/yyuu/pyenv.git ~/.pyen ...

  6. 【POJ - 3104 】Drying(二分)

    Drying 直接上中文 Descriptions 每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台 ...

  7. 简单聊聊红黑树(Red Black Tree)

    ​ 前言 众所周知,红黑树是非常经典,也很非常重要的数据结构,自从1972年被发明以来,因为其稳定高效的特性,40多年的时间里,红黑树一直应用在许多系统组件和基础类库中,默默无闻的为我们提供服务,身边 ...

  8. Spring条件注解@Conditional

    @Conditional是Spring4新提供的注解,它的作用是根据某个条件创建特定的Bean,通过实现Condition接口,并重写matches接口来构造判断条件.总的来说,就是根据特定条件来控制 ...

  9. 客户端埋点实时OLAP指标计算方案

    背景 产品经理想要实时查询一些指标数据,在新版本的APP上线之后,我们APP的一些质量指标,比如课堂连接掉线率,课堂内崩溃率,APP崩溃率等指标,以此来看APP升级之后上课的体验是否有所提升,上课质量 ...

  10. PythonDay04

    ## 第四章 ### 今日内容 - 列表- 元组- range ### 列表 列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,是一种可变的数据类型 64位python的限制是 11 ...