装饰器模式(Decorator)

转载 2016年08月30日 14:35:23

装饰器模式(Decorator)

对客户透明的方式动态地给一个对象附加上更多的责任,同时又不改变其结构。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

类图:

这里写图片描述

  • 1.抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

  • 2.具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。

  • 3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

  • 4.具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

例子

Java IO中就是典型的装饰器

//InputStream提供的基本方法(Component)
public abstract class InputStream implements Closeable {

}
//默认目标实现类(ConcreteComponent)
public class FileInputStream extends InputStream {

}
/*装饰实现类(FilterInputStream)一定是继承或实现原始接口(InputStream)的,内部有包含一个原始接口的超类(其实就是某个默认目标实现类)*/
//Decorator
public class FilterInputStream extends InputStream {
    /**
     * The input stream to be filtered.
     */
    protected volatile InputStream in;

    protected FilterInputStream(InputStream in) {
        this.in = in;
    }
}
//具体装饰类(ConcreteDecorator)
public class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
}
//具体装饰类(ConcreteDecorator)
public class DataInputStream extends FilterInputStream implements DataInput {

    public DataInputStream(InputStream in) {
        super(in);
    }
}

总结

装饰器模式优点:

  • 1.装饰类和被装饰类可以独立发展,不会相互耦合。

  • 2.装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。就增加功能来说,装饰器模式相比生成子类更为灵活。

适用场景:

  • 1.扩展一个类的功能。

  • 2.动态增加功能,动态撤销。

Test

package com.qbz.test;

interface ICoffee {
    void showCoffee();

    float showPrice();
}

// 原始咖啡
class Coffee implements ICoffee {
    private String name;
    private float price;

    public Coffee(String name, float price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public void showCoffee() {
        System.out.println(name + " coffee");
    }

    @Override
    public float showPrice() {
        return price;
    }
}

// 抽象装饰器
abstract class Decorator implements ICoffee {
    private ICoffee coffee;

    public void setCoffee(ICoffee coffee) {
        this.coffee = coffee;
    }

    @Override
    public void showCoffee() {
        coffee.showCoffee();
    }

    @Override
    public float showPrice() {
        return coffee.showPrice();
    }
}

// 加糖咖啡
class Sugar extends Decorator {
    @Override
    public void showCoffee() {
        System.out.println("加糖");
        super.showCoffee();
    }

    @Override
    public float showPrice() {
        return super.showPrice() + 5;
    }
}

// 加牛奶的咖啡
class SugarMilk extends Decorator {
    @Override
    public void showCoffee() {
        System.out.println("加糖、加牛奶");
        super.showCoffee();
    }

    @Override
    public float showPrice() {
        return super.showPrice() + 10;
    }
}

public class Main {

    public static void main(String[] args) {
        Coffee coffee = new Coffee("拿铁", 20);
        // 加糖
        Decorator sugar = new Sugar();
        sugar.setCoffee(coffee);
        sugar.showCoffee();
        System.out.println(sugar.showPrice());
        // 加糖,加牛奶的咖啡
        Decorator sugarmilk = new SugarMilk();
        sugarmilk.setCoffee(coffee);
        sugarmilk.showCoffee();
        System.out.println(sugarmilk.showPrice());
    }

}

输出

加糖
拿铁 coffee
25.0
加糖、加牛奶
拿铁 coffee
30.0

JS实现HTML实体与字符的相互转换(一)

最近在用Node.js获取网页时发现返回的网页中有一些实体字符,比如中文应该是“用户名”,结果返回的是用户名,读起来相当不爽,于是网上查询能将html实体字符...

python进阶7:decorator装饰器

本文介绍了装饰器的概念及其用法
  • aeoob
  • aeoob
  • 2017年02月23日 12:27
  • 146

装饰器(Decorator)模式

  • 2014年12月22日 12:10
  • 116KB
  • 下载

装饰器模式(Decorator)

1.认识装饰器模式     装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的...

Java装饰器模式(Decorator)

一、概述       装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,可以在不创建更多子类的情况下,将对象的功能加以扩展,是继承关系的一个替代方案。用意:动态地为对...

装饰器模式(Decorator)

1.认识装饰器模式     装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的...

Session_Decorator(装饰器模式)

...

装饰器模式(Decorator)

在面向对象设计过程中,经常会遇到需要对现有的类的功能进行扩展,通常我们可以采用继承的方式。例如老罗最近在做手机,一开始需要定义手机所应具有的功能: 1 interface Phone{ 2 ...

Python装饰器 decorator 设计模式

http://www.tuicool.com/articles/FZBnmy

装饰器(Decorator)模式

江苏 无锡 缪小东        Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式;2.结构型模式;3.行为模式三种)。它的主要用意是:动态地...
  • novelly
  • novelly
  • 2013年07月13日 17:22
  • 450
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装饰器模式(Decorator)
举报原因:
原因补充:

(最多只允许输入30个字)