在java IO 流中我们经常看到这样的写法:

ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("obj.ser")));

这其实就是IO流使用装饰设计模式,装饰设计模式通常包含:

1、抽象的组件(抽象类或接口)

2、具体的组件:需要装饰的对象

3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法

4、具体的装饰类:被装饰的对象

下面模拟咖啡用装饰模式,直接上完整代码:

package com.xzlf.io;

/**
* 模拟咖啡
* 1、抽象的组件(抽象类或接口)
* 2、具体的组件:需要装饰的对象
* 3、抽象的装饰:包含了对抽象组件的引用以及装饰着共同的方法
* 4、具体的装饰类:被装饰的对象
* @author xzlf
*
*/
public class DecorateTest02 {
public static void main(String[] args) {
Drink coffe = new Coffe();
Drink milk = new Milk(coffe);
System.out.println(milk.info() + "-->" + milk.cost());
Drink suger = new Suger(coffe);
System.out.println(suger.info() + "-->" +suger.cost());
suger = new Suger(milk);
System.out.println(suger.info() + "-->" +suger.cost());
}
} /* 抽象组件 */
interface Drink{
double cost();// 费用
String info();// 说明 } /* 具体组件 */
class Coffe implements Drink{
private String name = "原味咖啡"; @Override
public double cost() {
return 10;
} @Override
public String info() {
return name;
} } /* 抽象的装饰类 */
abstract class Decorate implements Drink{
private Drink drink; public Decorate(Drink drink) {
this.drink = drink;
} @Override
public double cost() {
return drink.cost();
} @Override
public String info() {
return drink.info();
}
} /* 具体的装饰类 */
class Milk extends Decorate{ public Milk(Drink drink) {
super(drink);
} @Override
public double cost() {
return super.cost()*10;
} @Override
public String info() {
return super.info() + "加入了牛奶";
}
} /* 具体的装饰类 */
class Suger extends Decorate{ public Suger(Drink drink) {
super(drink);
} @Override
public double cost() {
return super.cost()*2;
} @Override
public String info() {
return super.info() + "加入了蔗糖";
}
}

运行测试:

Java IO 流 -- 设计模式:装饰设计模式的更多相关文章

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

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

  2. [javaSE] IO流(装饰设计模式)

    装饰设计模式:当想要对已有的对象进行功能增强时,可以自定义类将已有的对象传入,并提供加强功能,自定义的该类称为装饰类 典型的: Reader--FileReader --BufferedReader ...

  3. 【转】java io 流 设计模式

    知识点:什么是装饰模式: http://wenku.baidu.com/view/ad4eac9f51e79b896802263b.html(原理讲的很清楚) http://wenku.baidu.c ...

  4. java IO流的继承体系和装饰类应用

    java IO流的设计是基于装饰者模式&适配模式,面对IO流庞大的包装类体系,核心是要抓住其功能所对应的装饰类. 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的 ...

  5. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

  6. Java IO流01-总叙

     Java IO包体系结构图: 1.流式部分――IO的主体部分: 2.非流式部分——主要包含一些辅助流式部分的类,如:File类.RandomAccessFile类和FileDescriptor等类: ...

  7. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...

  8. IO流与装饰者模式

    java使用IO流来处理不同设备之间数据的交互;所有的IO操作实际上都是对 Stream 的操作 从功能上划分: 输入流: 当数据从源进入的编写的程序时,称它为输入流; 输出流: 从程序输出回另一个源 ...

  9. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

随机推荐

  1. MySQL常用存储引擎:MyISAM与InnoDB之华山论剑

    一 MyISAM 1.1 MyISAM简介 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺 ...

  2. 深入调研Linq to Objects Join Linq to Entity

    最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity.参考一些网友的代码案例,深入实践了一下使用EntityFramew ...

  3. 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  4. 使用IDEA编写JDBC

    省去下载MySQL的过程,创建数据库demo 首先在下载的Java服务中将此jar包复制到项目中的一个空文件夹中 在当前工程下新建目录lib(名字可自定) 找到MySQL的Java服务的jar包 打开 ...

  5. 使用Shiro+JWT完成的微信小程序的登录(含讲解)

    使用Shiro+JWT完成的微信小程序的登录 源码地址https://github.com/Jirath-Liu/shiro-jwt-wx 微信小程序用户登陆,完整流程可参考下面官方地址,本例中是按此 ...

  6. implements Serializable

    implements Serializable 1. 序列化和反序列化 序列化: 把对象转换为字节序列的过程称为对象的序列化. 反序列化: 把字节序列恢复为对象的过程称为对象的反序列化. 在Java和 ...

  7. gitlab问题

    1.gitclone前http://10.10.11.4:9999/SZRDC/I`````````.git改为http://git.berchina.com:9999/~~~~``` 2.Cloni ...

  8. Linux 常用命令(遇见了,就记录了 ,随缘吧)

    1.实时查看最后日志(默认10条) # tail -f xxxxxx.log 2.查看结尾多少条日志 # tail -n30 -f xxxx.log 3.根据关键字查询日志 # cat xxxxx.l ...

  9. 项目伪模块化开发之:requirejs(AMD)开发

    附:伪模块开发,终将会被es6的模块开发取代.其只为过渡阶段使用 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码 ...

  10. JavaScript 进阶入门

    17:56:11 2019-08-09 如题所见 还是入门 23:10:17 2019-08-11 继续学习 16:34:59 2019-08-14 虽然入了门 但还是缺少实践 本文资料来源: 慕课网 ...