[工作中的设计模式]装饰模式decorator

一、模式解析

 装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰模式的要点主要是:

1、需要对已有对象扩展新的功能,又不希望改变原有对象接口;

2、装饰者对象与原有对象需要继承相同接口,初始化装饰对象时将原有对象传入装饰对象;

3、可以对一个对象定义多个装饰着对象,进行分别装饰或者组合装饰

二、模式代码

1、抽象接口

package decorator.patten;

public interface Component {
    public void operation();
}

2、定义被装饰对象

package decorator.patten;

public class ConcreteComponent implements Component {

    @Override
    public void operation() {
        System.out.println("我是被装饰对象,我执行了");
    }

}

3、定义装饰者对象A

package decorator.patten;

public class DecoratorA implements Component {
    Component component;
    public DecoratorA(Component component){
        this.component=component;
    }
    @Override
    public void operation() {
        System.out.println("我是装饰对象A,我在被装饰对象前增加打印");
        component.operation();
    }

}

4、定义装饰者对象B

package decorator.patten;

public class DecoratorB implements Component {
    Component component;
    public DecoratorB(Component component){
        this.component=component;
    }
    @Override
    public void operation() {
        component.operation();
        System.out.println("我是装饰对象b,我在被装饰对象后添加打印");
    }

}

5、定义客户端

public class Client {
    public static void main(String[] args) {
        Component component=new DecoratorB(new DecoratorA(new ConcreteComponent()));
        component.operation();
    }
}

6、执行结果

我是装饰对象A,我在被装饰对象前增加打印
我是被装饰对象,我执行了
我是装饰对象b,我在被装饰对象后添加打印

三、说明

1、装饰着模式可以为被装饰者添加新的功能,,将核心功能和装饰功能进行分离,比如日志打印,字符集处理等
2、可以对对象进行多此装饰,装饰均会被执行
3、示例中多次装饰没有顺序,但实际中往往会是有序的,比如数据加密和数据过滤,如果先加密再过滤就会出现问题
4、装饰对象和被装饰对象均集成同一个接口,有时候为了简化,我们会将装饰对象直接集成被装饰对象,这就是子类重写父类方法达到扩展功能的
四、应用场景

装饰模式最典型的应用就是java IO中对inputstream和outputstream的装饰,例如

dis = new DataInputStream(
                    new BufferedInputStream(
                            new FileInputStream("test.txt")
                    )
            );
时间: 2024-10-22 17:15:29

[工作中的设计模式]装饰模式decorator的相关文章

[工作中的设计模式]享元模式模式FlyWeight

一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 享元模式:主要为了在创建对象时,对共有对象以缓存的方式进行保存,对外部对象进行单独创建 模式要点: 1.享元模式中的对象分为两部分:共性部分和个性化部分,共性部分就是每个对象都一致的或者多个对象可以共享的部分,个性化部分指差异比较大,每个类均不同的部分 2.共性部分的抽象就是此模

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

[工作中的设计模式]策略模式stategy

一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口,执行同样的行为,为可以替代的 3.算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算. 二.模式代码 算法接口: /** * 算法统一接口,所有算法继承此接口 * @author zjl * @time 2016-1-24 * */ public interface IStra

[工作中的设计模式]模板模式

一.模式解析 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意 模板模式的关键点为: 1.有一个父类,将整体业务逻辑和公用方法进行封装: 2.父类将具体的有差异的业务定义为抽象方法: 3.子类继承父类后,实现这些抽象方法,完成对自己业务流程的: 4.子类不可以改变父类的整体业务逻辑流程: 5.子类也可以覆盖父类中其他方法,实现定制化业务

设计模式--装饰模式(Decorator)

装饰模式(Decorator) : 动态的给一个对象加入一些额外的职能,就添加功能来说,装饰模式比生成子类更为灵活. 实例: ConcreteComponent:让Decorator对象为自己加入功能.有时候使用ConcreteComponent的派生类提供核心功能.在这样的情况就是用ConcreteComponent替代了Component的功能,并且装饰者是继承于ConcreteComponent的子类. Component:定义ConcreteComponent和Decorator类要实现

设计模式-装饰模式(Decorator Pattern)

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.) 装饰模式有四个角色:1.Component抽象构件Component

[工作中的设计模式]原型模式prototype

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

[工作中的设计模式]备忘录模式memento

一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式可以根据客户指令,将相应的对象特有属性进行快照,如果客户要恢复对象,则根据快照提供的特有属性进行还原. 二.模式代码 package memento.patten; /** *备忘录类,同时指定要保存的对象属性

[工作中的设计模式]组合模式compnent

一.模式解析 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 组合模式的要点是: 1.对象整体以树形层次结构进行展示 2.树的根节点和子节点均可以添加删除子节点,叶子节点无子节点 3.可以通过节点的行为动作调用并展示他所有自己点的行为 4.为了方便的实现无限节点的扩展,我们通常定义一个公共的接口,所有子节点和叶子节点均实现此接口 二.模式代码 1.公共接口,供所有子节点和叶子节点实现 package component.patten; public