06JavaIO详解_IO流中的设计模式-装饰者模式

Io流里面的过滤流和节点流用的就是装饰者模式。整个的IO体系就是装饰模式。

这个写法就是装饰者模式。对上面的三个已经存在的类(DataOutputStream,BufferedOutputStream,FileOutputStream)进行组合,具有三种功能。

对于DataOutputStream dos=new DataOutStream(new BufferedOutputStream(new FileOutputStream("data.txt")));

这行代码来说。

OutPutStream是抽象构建角色。因为这三个类都是继承于OuputStream抽象类的。

FileOutputStream是具体构建角色(真实角色)(节点流)。

FilterOutPutStream和FilterInputStream是装饰角色。因为在Io体系中,BufferedOutputStream,DataOutStream都是继承自FilterOutPutStream抽象类的。

BufferedOutputStream,DataOutStream是具体装饰角色。

装饰模式的特点:

1.装饰对象和真实对象有相同的接口。这句话是说,不管是BufferedOutputStream(装饰角色)还是FileOutputStream(真实角色)都是继续自OutPutStream.

2.装饰角色包含一个真实对象的引用。

3.装饰对象接收所有来自客户端的请求,再把请求交给真实对象。

4.装饰对象可以在转发这些请求以前或以后增加一些附加的功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。

实现自己的装饰模式:

案例结构如下:

上图中:Client是测试端。

Component是抽象构建角色,相当于OutputStream.

ConcreteComponent是具体构建角色(真实角色),也就是IO流中的节点流,相当于FileOutputStream.

Decorator是抽象构建角色,相当于过滤流的父类,也就是相当于IO流中的FilterOutputStream.

ConcreteDecorator1相当于IO流中的过滤流,也就是这篇文章中的BufferedOutputStream.

ConcreteDecorator2相当于IO流中的过滤流,也就是这篇文章中的DataOutputStream.

具体代码如下:

Component

package com.guigu.shen.ConcreteComponent;
//抽象构建角色
public interface Component {
public void dosome();
}

ConcreteComponent:

package com.guigu.shen.ConcreteComponent;
//具体构建角色(就是真实角色,要被修饰的角色)
public class ConcreteComponent implements Component {

    public void dosome() {
        System.out.println("功能A");

    }

}

Decorator:

package com.guigu.shen.ConcreteComponent;
/*
 * 装饰角色
 * 1.要实现抽象构建角色
 * 2.要含有抽象构建角色的引用。
 *
 */
public class Decorator implements Component {
private Component component;
    public Decorator(Component component) {
        this.component=component;
    }

    @Override
    public void dosome() {

        this.component.dosome();

    }

}

ConcreteDecorator1:

package com.guigu.shen.ConcreteComponent;
//具体装饰角色1
public class ConcreteDecoraror1 extends Decorator {
    public ConcreteDecoraror1(Component component) {
        super(component);

    }

    @Override
    public void dosome() {
        // TODO Auto-generated method stub
        super.dosome();
        doAnotherThing();
    }
    public void doAnotherThing()
    {
        System.out.println("功能B");

    }

}

ConcreteDecorator2:

package com.guigu.shen.ConcreteComponent;
//具体装饰角色2
public class ConcreteDecorator2 extends Decorator {

    public ConcreteDecorator2( Component component) {
        super(component);
    }

    @Override
    public void dosome() {
        super.dosome();
        this.doAnotherThing();
    }
public void doAnotherThing()
{

System.out.println("功能C");
}
}

Client:

package com.guigu.shen.ConcreteComponent;

public class Client {
public static void main(String[] args) {
//1.先建立具体构建角色也就是真实角色(相当于节点流)
    Component component=new ConcreteComponent();
//2.构建第一个装饰角色
    Component component2=new ConcreteDecoraror1(component);
    //3.构建第二个装饰角色
    Component component3=new ConcreteDecorator2(component2);
    component3.dosome();
}
}

结果:

功能A

功能B

功能C

你看。我们的本来功能是功能A,但是我们给他又加了两个功能,功能B和功能C。

对于上面程序的执行流程解释如下:

当我们执行component3.dosome时——>

执行:ConcreteDecorator2中的dosome()方法。

dosome()方法是:

                        @Override
                    public void dosome() {
                                super.dosome();
                                this.doAnotherThing();
                                                                    }

很明显要执行ConcreteDecoator2的父类Decorator的dosome方法。

我们看一下Decorator的dosome方法的方法。

public Decorator(Component component) {
                                                          this.component=component;
                                                                     }
    
                                                             @Override
                                                          public void dosome() {

this.component.dosome();
        
                                                                          }

很明显先要执行this.component=component里面的dosome方法。也就是公共A。

然后就是就是B

最后是C

这个过程好好看看。

时间: 2024-08-08 13:56:05

06JavaIO详解_IO流中的设计模式-装饰者模式的相关文章

Symfony2中的设计模式——装饰者模式

装饰者模式的定义 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰者模式把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象,因此,当需要执行特殊行为时,客户端代码就可以在运行的时候根据需要有选择地.按顺序地使用装饰功能包装对象了. 图1 使用场景 设想一下,如果我们需要创建一个在不同场合有不同着装的学生,例如:在学校学生需要穿上校服,在舞会学生需要穿上正装,在家学生可以裸装(有点变态),当然,还可以学习超人把

03JavaIO详解_IO流分类中的节点流和过滤流

我们上一篇文章讲了InputStream(输入流).输入流里面有两种流:节点流和过滤流.我们这篇文章讲一下这个. 回顾什么是节点流:节点流就是直接和目标打交道的. 过滤流:就是直接和节点流打交道的. InputStream的节点流和过滤如下所示: 解释一下上面这张图:对于InutStream来说有这么多的子类.其中FilterInputStream(他的子类DataInputStream,BufferedInputStream....都是过滤流)是过滤流,其他都是节点流. 我们再讲一下输出流(o

详解Http请求中Content-Type讲解以及在Spring MVC中的应用

详解Http请求中Content-Type讲解以及在Spring MVC中的应用 引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值,以及在spring MVC中如何使用它们来映射请求信息. 1.  Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,

Icehouse版keystone配置完全详解(更新中)

本文全面解读Icehouse发行版keystone的配置文件keystone.conf [DEFAULT]admin_token=(string value)# 这是一个公知的密码,用于初始化keystone,强烈建议在生产模式中禁用,只需要在# keystone-paste.ini文件中移除AdminTokenAuthMiddleware这个pipeline即可 public_bind_host=(string value)# The IP Address of the network int

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

详解WebService开发中四个常见问题(1)

详解WebService开发中四个常见问题(1) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WOT2014:用户标签系统与用户数据化运营培训专场 任何问题都需要从它的根源说起,所以简单说一下WebService的工作原理.客户端调用一个WebService的方法,首先需要将方法名和需要传递的参数包装成XML(也就是SOAP包),通常是通过HTTP传递到服务器端,然后服务器端解析这段XML,得到被调

Android菜单详解——理解android中的Menu

Android菜单详解--理解android中的Menu 前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu&qu

详解WebService开发中四个常见问题(2)

详解WebService开发中四个常见问题(2) WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WOT2014:用户标签系统与用户数据化运营培训专场 问题三:循环引用 还是先来看一个例子.下面是WebService的接口: 1 @WebService2     public interface IHello {3     4         @WebMethod5         public Str

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就