设计模式之Decorator

 意图:    动态地给一个对象添加一些额外的职责. 就增加功能来说, Decorator模式相比生成子类更为灵活.

问题:    你需要使用的对象执行你要求的基本功能. 但是, 你可能需要为这个对象添加某些功能, 这些附加功能可能发生在对象的基础功能之前或之后.

效果: 被添加的功能属于小的对象. 好处是可以在ConcreteComponent对象的功能之前或之后动态添加功能. 注意: 虽然一个装饰者可以在被装饰者之前或之后添加功能,但对象链总是以ConcteteComponent对象结束.

 示例:

我们需要写一封信,但是有时候我想给这封信添加背景和边框效果,有时候只需要正文或边框或背景中的一种或任意组合(动态地给对象添加职责).如下图方式实现:

 

 

 

 想要边框和背景及正文的信时可以这样调用(注意此处BorderDecoratorLetter 和 BackgroundDecoratorLetter 实例化顺序可以改变):

new BorderDecoratorLetter(new BackgroundDecoratorLetter(new WriteLetter())).write();

想要边框和正文时可以这样调用: new BackgroundDecoratorLetter(new WriteLetter()).write();

只想要正文时可以这样调用: new WriteLetter().write();

实例2: 打印票据: 有的需要打印抬头,有的需要打印脚注,不需要打印脚注,有的需要0个或多个抬头与0个或多个脚注的组合,且对打印顺序有要求.

代码见附件.

实例3:Java IO包中的装饰模式:

java 代码
  1.    protected volatile InputStream in;   
  2.    protected FilterInputStream(InputStream in) {   
  3.        this.in = in;   
  4.    }   
  5.    public int read() throws IOException {   
  6.        return in.read();   
  7.    }  

 

 

<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#00cc99,#3333cc,#ccccff,#b2b2b2"></p:colorscheme>   new BufferedInputStream(new DataInputStream(new FileInputstream(new File("c:/a.txt"))));

DataInputStream 和 BufferedInputStream 都继承自 FilterInputStream 所以我们可以轻而易举的装饰出我们需要的流:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值