装饰者模式-轻松记住IO类的关系与API

一、目录

二、概述与模型

1、概述

  含义:控制对对象的访问。

  作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理。

  优点:

  缺点:

2、模型

  

  Component(抽象组件):定义代理角色和真实角色的公共对外方法。

  ConcreteComponent(真实组件):实现抽象角色,定义真实角色所要实现的真实业务逻辑,供代理角色调用。

  Decorator(抽象装饰者):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

  ConcreteDecorator(真实装饰者):

  最终目标:将统一的流程控制放到代理角色处理。

三、应用场景描述

  1、安全代理:屏蔽对真实角色的直接访问,由代理角色控制,等业务真实需要的时候,才由代理对象调用真实对象方法。

  2、远程代理:通过代理类处理远程方法调用(RMI)。

  3、延迟代理:先加载轻量级的代理对象,真正需要再加载真实对象。例如加载图片、视频,先由代理对象在后台开启流对象,待真正需要浏览图片、视频的时候,才由真实对象加载图片,最后由代理对象关闭流对象。

  4、事务:解决概述举例内容,一层不变的内容由代理对象承担,而真正的业务逻辑由真实对象的方法实现。

  5、真实系统的日志处理、JDBC事务、Connection的开启与关闭。

  代码演示场景描述:假设一个明星被邀请去拍广告、拍电影,那么务必有这些流程:面谈->起草合同->安排机票、车票->出席活动->结算尾款。假设一年拍一两次广告,那么完全由一个明星自己解决。事实上,每个明星都有经纪人,而明星只专心负责出席活动,其他事务由经纪人操作。

  

四、代码演示

1、抽象组件

public abstract class Component {
    public abstract  void display();
}

2、真实组件

public class ConcreteComponent extends Component{
    public void display() {
        System.out.println("我是一块泥土墙!");
    }
}

3、抽象装饰者

public class Decorator extends Component{
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    public Component getComponent() {
        return component;
    }

    public void setComponent(Component component) {
        this.component = component;
    }

    public void display() {
        component.display();
    }
}

4、真实装饰者

//装饰者A:泥土墙public class ConcreteDecoratorA extends Decorator {

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

    @Override
    public void display() {
        this.component.display();
        System.out.println("在泥土墙上加上水泥!");
    }
}
//装饰者B:带墙纸的墙public class ConcreteDecoratorB extends Decorator {

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

    @Override
    public void display() {
        this.component.display();
        System.out.println("在墙皮上添加墙纸");
    }
}

5、客户端

public class Client {
    public static void main(String [] args){
        //新建一面泥土墙:原始组件对象
        Component wall=new ConcreteComponent();

        //装饰者A:为泥土墙添加水泥
        ConcreteDecoratorA cementWall=new ConcreteDecoratorA(wall);
        cementWall.display();
        System.out.println("-----------分割线-------------");
        //装饰B:为泥土墙添加墙纸
        ConcreteDecoratorB paperWall=new ConcreteDecoratorB(wall);
        paperWall.display();
        System.out.println("-----------分割线-------------");

        //装饰者B:为水泥墙(装饰者A)添加墙纸
        ConcreteDecoratorB mixedWall=new ConcreteDecoratorB(cementWall);
        mixedWall.display();
    }
}

6、测试结果

时间: 2024-10-10 01:31:55

装饰者模式-轻松记住IO类的关系与API的相关文章

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

JavaSE(一) IO类层次关系和各种IO流的用法总结

今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于整个IO体系中的什么位置,对于其中的整个IO体系一点不了解,每次使用的时候都需要百度查看用法例子,这就说明自己对这块的知识有所欠缺,所以今天,来详细的分析,解剖一下IO的整个结构. 借鉴博文:http://www.cnblogs.com/skywang12345/p/io_01.html  该博主写

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

设计模式06_装饰者模式

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51531519 1.定义 动态将职责添加到对象身上.若要扩展功能,装饰者模式提供了比继承更加灵活的替代方案.(摘自Head First 中文版第91页) 2.说明 通常情况下,在使用继承设计子类的行为,是在编译时静态决定的,所有的子类都会继承到相同的行为,这样会产生耦合较高.而利用组合来扩展对象的行为,就可以在运行时动态地进行扩展.装饰者模式是组合的一种表现

设计模式之装饰者模式(二)

装饰者模式在实际中的应用是java输入输出流,java.io中的类很庞大,我们在学习的时候,看到如此众多的类都觉得无从下手,实际上是因为java.io中使用了装饰者模式,大量的类都是装饰者. 比如FileInputStream类,FileInputStream用来读取文本文件,是被装饰者,而它的装饰者有BufferedInputStream和LineNumberInputStream,因为有了这两个装饰者,读取文件时使用FileInputStream可以通过缓冲输入,还能计算行数. 所以我们就可

设计模式——装饰者模式

1.装饰者模式是在不必改变原类文件和使用继承关系的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式的特点: 1)      装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 2)      装饰对象包含一个真实对象的引用 3)      装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象 4)      装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定

JAVA设计模式初探之装饰者模式

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的. 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 实际上Java 的I/O API就是使用Decorator实现的. //定义被装饰

设计模式-装饰器模式

前言 点击查看:设计模式系列 装饰器模式(Decorator) 定义:不通过派生类增改类属性动作,而是通过模式设计动态的达到这种效果,而且比继承更方便灵活减少程序的复杂性. 举例: 汪峰打造冠军团队. 首先团队类为空,经过汪峰不断的努力,为团队争取学员,也为团队队员打造合适的平台,让其发挥. 团队不断的变强,变完整,是由装饰者,根据不同的需求,给基类进行增改,一致最后赢得你的赞同,满足你的需求. 实现装配器模式的类图: 战队组建代码 //汪峰战队 abstract class WangFengT

php模式之装饰者模式学习

<?php //装饰器模式主要是两类对象--被装饰者和装饰器对象 //装饰器和被装饰者拥有一样的超类(接口) //外层装饰对象重写公共方法,并委托调用内层方法. interface Decorate  {    # code...    public function display();  }     class Person implements Decorate  {       public $name;       public function __construct($name)