在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. 下拉框select->option中如何把参数传到视图函数中去

    例子: <select name="p_id" id=""> {% for p in permissions %} <option value ...

  2. Material Design 组件之 CollapsingToolbarLayout

    CollapsingToolbarLayout 主要用于实现一个可折叠的标题栏,一般作为 AppBarLayout 的子 View 来使用,下面总结一下 CollapsingToolbarLayout ...

  3. Java中使用RSA算法加密

    Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...

  4. css过渡和2d详解及案例

    css过渡和2d详解及案例(案例在下方,不要着急) 本文重点: 1.在2D变化使用过程中,有些需求需要两种或两种以上的变化同时使用, 值得注意的是尽量把位移变化放在最前面,把其他变化放在最后面,属性值 ...

  5. Error while processing transaction.java.lang.IllegalStateException: begin() called when transaction is OPEN!

    Spark Streaming从flume 中使用Poll拉取数据时,报如下错误: Error while processing transaction. java.lang.IllegalState ...

  6. 10年阿里自动化测试架构师帮您收集的:git常用命令大全以及git原理图【泣血推荐,建议收藏】

    一.Git分布式版本控制简介 ​ Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势.本来想着只把最有用.最常用的 Git 命令记下来, ...

  7. 多线程之旅(Task 任务)

    一.Task(任务)和ThreadPool(线程池)不同       源码 1.线程(Thread)是创建并发工具的底层类,但是在前几篇文章中我们介绍了Thread的特点,和实例.可以很明显发现局限性 ...

  8. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  9. Hadoop(五):HDFS的JAVA API基本操作

    HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...

  10. GhostNet: 使用简单的线性变换生成特征图,超越MobileNetV3的轻量级网络 | CVPR 2020

    为了减少神经网络的计算消耗,论文提出Ghost模块来构建高效的网络结果.该模块将原始的卷积层分成两部分,先使用更少的卷积核来生成少量内在特征图,然后通过简单的线性变化操作来进一步高效地生成ghost特 ...