javaI/O包中的包装模式

设计模式解析–适配器模式

  • 对适配器模式功能比较好理解,就是讲一个类的接口换成客户端所能接受的另外一个接口,从而使两国接口不匹配而无法在一起工作的两个类能在一起工作。
适配器的结构
  • 适配器UML图如下
    在这里插入图片描述

  • Target(目标接口):需要转换的接口

  • Adaptee(源角色):需要适配的类或接口

  • Adapter(适配器):将接口适配成目标接口,继承源接口,实现目标接口。

  • 如下一个简单案例

//目标接口
public interface FlyTarget {void canFly();
}
//需要适配的类
public class Flying  {public void fly() {System.out.println("i can flay");}
}
//代理实现
public class Bird extends Flying implements FlyTarget {@Overridepublic void canFly() {System.out.println("i am bird");fly();System.out.println("over flay,i am walk");}
}
  • 如上我们利用 Flying 来实现鸟这个类的FlyTarget
Java I/O 中的适配器模式
  • 适配器将一个接口适配到另外一个接口,在Java I/O中比较多这种模式,例如,将字符串数据转字节数据保存到文件中。或者将字节数据转流数据等。比如 InputStreamReader,OutputStreamWriter
  • InputStreamReader 与 OutputStreamWriter 分别基础Reader 和 Writer,并且构造方法中都需要给一个InputStream 和 OutputStream实例。这里面 InputStreamReader 与 OutputStreamWriter 的作用就是将 InputStream 和 OutputStream适配到 Reader 和 Writer

请添加图片描述

  • InputStreamReader 实现了Reader接口,并且持有InputStream的引用,通过StreamDecoder间接引用的。因为从byte到Char需要编码
  • 很显然适配器就是InputStreamReader,目标接口是Reader,源接口/类 就是InputStream,我们利用InputStream的实现来实现这个Reader接口。
  • OutputStreamWriter类也是一样的结构
  • I/O类库中还有其他类似案例:StringReader将 String类适配到Reader接口,ByteArrayInputStream 适配器将byte数组适配到InputStream流处理接口。

设计模式解析–装饰器模式

  • 装饰器,就是讲某个类重新装扮一下,使得它功能更强,当作为原来这个类的使用者还不应该收到装饰器前后装饰的影响,不破坏原有类结构,所以装饰器对是对被装饰类使用者透明。
装饰器模式的结构
  • 装饰器UML模式如下

在这里插入图片描述

  • Component:抽象组件角色,定义一组抽象接口,规定这个被装饰组件的功能

  • ConcreteComponent:实现这个抽象组件的所有功能

  • Decorator:装饰器角色,持有一个Comonent对象实例的引用,定义一个与抽象组件一致的接口。

  • ConcreteDecorator:具体装饰器实践者,负责实现装饰器角色定义的功能

  • 如下简单案例

//初始功能接口定义
public interface FlyConponent {void flay();
}
//初始功能实现
public class FlyConcreteComponent implements FlyConponent {@Overridepublic void flay() {System.out.println("to fly");}
}
//装饰器角色
public class FlyDecorator implements FlyConponent {public FlyConponent flyConponent;public FlyDecorator(FlyConponent flyConponent) {this.flyConponent = flyConponent;}@Overridepublic void flay() {flyConponent.flay();}
}//装饰器实现
public class EagleFlyComponent extends FlyDecorator {private String tool;public EagleFlyComponent(FlyConponent flyConponent, String tool) {super(flyConponent);this.tool = tool;}public void birdFlay() {System.out.print(" use " + tool);flyConponent.flay();}
}
  • EagleFlyComponent 通过FlyDecorator 获取到原始接口功能的引用,让后利用最初始的实现FlyConcreteComponent 来实现自己新的功能 birdFlay
java I/O中的装饰器模式
  • 上面案例中,装饰器模式就是赋予被装饰类更多的功能,在Java I/O中,有很多组合功能情况,这些不同功能的组合就是装饰器实现的,比如FilterInputStream为案例说明

  • 如下FilterInputStream的UML图
    请添加图片描述

  • InputStream类是一个抽象类,FileInputStream是具体的组件,实现了抽象类所有接口,所以FilterInputStream是我们的装饰角色,他实现了InputStream所有接口,并且持有InputStream的一个实例

  • BufferInputStream是具体的装饰器实现,他给InputStream增加了功能。这个装饰器类作用就是使InputStream读取数据保存在内存中。从而提高读取的性能

  • 与只类似的功能的还有LineNumberINputStream,作用是按行读取数据的功能,他们使InputStream类增强了功能,或者提升性能。

适配器模式与装饰器模式区别

  • 装饰器,与适配器都属于包装(Wrapper)模式。都是起到了包装一个类或者接口的作用,但是目的不一样
  • 适配器模式是要将一个接口转成另外一个接口,他的目的是通过改变接口来达到重复使用的目的
  • 装饰器不是要改变被装饰对象的接口,而是保持原有接口,但是增强原有对象的功能或者改变原有对象的处理方法从而提升性能。
  • 因此两个模式的设计目的是不同的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps vs. Agile:它们有什么共同点?

导语DevOps与Agile有很多不同,但它们之间仍可发现很多共同点,这篇文章为读者揭晓。正文DevOps和Agile之间有着明显的关系。Agile是方法论,Scrum是框架,并DevOps随着看板也落在了Agile的“伞”下。精益,大规模的Scrum&a…

[Java基础]Properties

代码如下: package PropertiesPack;import java.util.Properties; import java.util.Set;public class PropertiesDemo01 {public static void main(String[] args){Properties prop new Properties();prop.put("001","Tom");prop.put("002",&…

空心点_空心砖的新玩法,看完大开眼界

我们所见的空心砖大都在建筑工地上常见的有水泥空心砖和粘土空心砖特点是轻质、环保、保温和隔音如此常见的空心砖仅仅是只为建筑而生吗不是,不管是古朴砖红色空心砖,还是高冷的水泥空心砖他们可以演绎不同的角色甚至让每个渴望回归本真的我们&#xff0…

IO与零拷贝

IO与零拷贝 零拷贝基本介绍 零拷贝时网络编程的一个关键优化点在Java程序中,常用的零拷贝又mmap(内存映射)和sendFile。那么在OS中的设计时如何,我们需分析mmap和sendFile对比最后通过案例分析 用户进程与操作系统关系 我们先…

从堆里找回“丢失”的代码

前言 前一阵子,使用小乌龟(TortoiseGit)提交代码的时候,错误的 Revert 了部分代码,本文记录了找回这部分代码的过程。文章标题致敬张银奎老师《格蠹汇编》的第一章 —— 从堆里抢救丢失的博客。说明: 本文的…

[Java基础]线程基础与实现多线程

代码如下&#xff1a; package MyThreadPack;public class MyThread extends Thread {Overridepublic void run() {for (int i 0;i<100;i){System.out.println(i);}} }package MyThreadPack;public class MyThreadDemo01 {public static void main(String[] args){MyThrea…

gpio 树莓派3a+_树莓派4上市:性能飙升起售价依然是35美元

旨在通过超实惠方式&#xff0c;鼓励孩子们投身编程事业的奇趣开发套件树莓派&#xff0c;在昨天迎来了Raspberry Pi 4正式开售的消息。新一代树莓派引入64位处理器、802.11ac双频Wi-Fi以及通过HAT的以太网供电(PoE)等新卖点。树莓派Raspberry Pi 4的处理能力是前一代的三倍、多…

入门级微单反性能对比

入门级相机筛选 先说挑选规则 由于微单体型小于单反&#xff0c;所以在机型选择上微单&#xff1e;单反&#xff1b;最好具备翻转屏和触摸屏&#xff1b;机身防抖不是刚需&#xff0c;但能解决小范围抖动情况下稳定问题&#xff1b;自动对焦很重要&#xff0c;眼控对焦是加分…

知识更新越来越快,但是学习起来越来越困

大家好&#xff0c;我是Z哥&#xff0c;先祝大家节日快乐。不知道这个假期你打算出门吗&#xff1f;Z哥我是打算不出远门了&#xff0c;怕死&#xff0c;哈哈。索性好好宅家里学习&#xff0c;强化一下自己。相信大家也感受到了&#xff0c;随着互联网加速了信息的流动速度&…

什么标准规定了aes加密_Python 爬虫进阶必备 | 关于某租房网站数据加密的分析(送两本 Python 书)...

关于某租房网站数据加密的分析aHR0cHM6Ly93d3cubWFvbWFvenUuY29tLw抓包分析先看看这个网站的首页数据可以看到首页的 html 是压缩的&#xff0c;但是格式化之后没有看到需要的首页数据。过滤 xhr 请求看到一个 index.json的请求可以看到这个请求的请求参数以及返回值都是密文返…

[Java基础]线程同步之卖票案列分析

案列: 卖票。 需求: 某电影院目前正在上映国产大片&#xff0c;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票。 代码如下: package SellTicketPack;public class SellTicket implements Runnable{private int tickets 100;Overrid…

sap 标准委外和工序委外_SAP FICO零基础学习_0035_标准成本估算-主数据-物料主数据...

前辈的第35堂课&#xff1a;谢谢大家的喜欢和关注噢~这里的“前辈”其实指的是给我讲课的前辈啦&#xff0c;我不是前辈噢&#xff0c;我只是一个刚刚接触FICO的小白&#xff0c;跟大家分享前辈给我讲的东西。因为刚接触&#xff0c;学习的内容比较简单~有基础的小伙伴可以去看…

[Java基础]线程安全的类

package ThreadDemoPack01;import java.util.*;public class ThreadDemo01 {public static void main(String[] args){StringBuffer sb new StringBuffer();//线程安全StringBuilder sb2 new StringBuilder();//线程不安全Vector<String> v new Vector<String>(…

数据结构与算法-- 八皇后问题(多种实现方案)

八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想&#xff0c;想到了一个经典的算法题&#xff0c;八皇后问题&#xff1a;题目&#xff1a;在8*8的国际象棋上摆放8个皇后&#xff0c;使得其互相不能攻击&#xff0c;即任意两个换后不能在同一行&#xff0c;同一列&a…

Blazor WebAssembly 3.2.0 正式起飞,blazor 适合你吗?

最近blazor更新很快&#xff0c;今天在官方博客上发布了Blazor WebAssembly 3.2.0 RC&#xff1a;https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-release-candidate-now-available/ &#xff0c;这是最后一次预览版了&#xff0c;功能开发都已经完成。5.19的…

中获取文件名不要扩展名_如何批量修改文件名,3s时间够不够

?点击关注Excel表哥公众号上一篇推文我们介绍了如何批量获取同一文件夹下所有的文件名。▲点此图片回顾很多读者获取到这些文件名之后的一种工作情形就是需要批量或者有针对性地修改这些文件的名称。那么但凡是这类需要批量操作的重复工作&#xff0c;Excel擅长。还是以上篇推…

数据结构与算法--死磕二叉树

死磕二叉树 近一年都比较关注算法相关的知识&#xff0c;也刷了不少题&#xff0c;之前的文章中大多也是算法相关的文章&#xff0c;但是感觉每次遇到树相关的题型都不能应对自如&#xff0c;因此还是有必要在相关知识上下功夫&#xff0c;因此有此次总结&#xff0c;以下是所…

Jenkins 中以构建 Tag 来实现版本管理

好的工具和流程能使我们事半功倍&#xff0c;而这个过程是不断迭代和演进的。关于这一块的内容&#xff0c;之前写过几篇文章&#xff1a;在团队中使用GitLab中的Merge Request工作模式敏捷下的需求和代码分支管理不断进化的分支和需求管理现在又有了些新的变化和改进&#xff…

将字符串添加负数_Go语言实现LeetCode算法:8 字符串转整数

Go语言中文网&#xff0c;致力于每日分享编码、开源等知识&#xff0c;欢迎关注我&#xff0c;会有意想不到的收获&#xff01;看到题目&#xff0c;是不是超级简单&#xff0c;用 strconv.Atoi 就可以了&#xff1f;题目当然不是这么简单的要求。1 题目描述实现atoi函数&#…

[Java基础]生产者和消费者模式概述与案例分析

代码如下: package BoxPack01;public class Box {private int milk;private boolean state false;public synchronized void put(int milk){if (state){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.milk milk;System.out.println("送奶…