java装饰器模式

转载 2016年05月30日 14:42:49


意图:动态的将责任附加到对象上
什么时候使用:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
2.处理那些可以撤销的职责
3.当不能采用生成子类的方式进行扩充时
结构图:

示例代码:

1 package com.test.patten.decorator;
2 
3 public interface Person {
4     void doCoding();
5 }
复制代码
 1 package com.test.patten.decorator;
 2 
 3 public class Employee implements Person {
 4 
 5     @Override
 6     public void doCoding() {
 7         System.out.println("程序员加班写程序啊,写程序,终于写完了。。。");
 8     }
 9 
10 }
复制代码
复制代码
1 package com.test.patten.decorator;
2 
3 public abstract class Manager implements Person{
4     
5     //装饰器增加功能
6     public abstract void doCoding();
7 
8 }
复制代码
复制代码
 1 package com.test.patten.decorator;
 2 
 3 public class ManagerA extends Manager {
 4     private Person person;//给雇员升职
 5     
 6     public ManagerA(Person person) {
 7         super();
 8         this.person = person;
 9     }
10     @Override
11     public void doCoding() {
12         doEarlyWork();
13         person.doCoding();        
14     }
15     /**
16      * 项目经理开始前期准备工作
17      */
18     public void doEarlyWork() {
19         System.out.println("项目经理A做需求分析");
20         System.out.println("项目经理A做架构设计");
21         System.out.println("项目经理A做详细设计"); 
22     }
23 }
复制代码
复制代码
 1 package com.test.patten.decorator;
 2 
 3 public class ManagerB extends Manager {
 4     private Person person;//给雇员升职
 5     
 6     public ManagerB(Person person) {
 7         super();
 8         this.person = person;
 9     }
10     @Override
11     public void doCoding() {
12         person.doCoding();
13         doEndWork();
14     }
15     /**
16      * 项目经理开始项目收尾工作
17      */
18     public void doEndWork() {
19         System.out.println("项目经理B 在做收尾工作");
20     }
21     
22 }
复制代码

测试一下:

复制代码
 1 package com.test.patten.decorator;
 2 
 3 public class Client {
 4     public static void main(String args[]){
 5         Person employee = new Employee();
 6         employee = new ManagerA(employee);//赋予程序猿项目经理A职责
 7         employee = new ManagerB(employee);//赋予程序猿项目经理B职责
 8         
 9         employee.doCoding();
10     }
11 }
复制代码
项目经理A做需求分析
项目经理A做架构设计
项目经理A做详细设计
程序员加班写程序啊,写程序,终于写完了。。。
项目经理B 在做收尾工作

 实际应用中的例子:java i/o

应用到的设计原则:对扩展开放,对修改关闭

优缺点:

1.装饰者类反应出被装饰的组件类型

2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的

3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂

4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

相关文章推荐

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承关系的类:Father、Son、GrandSon,我们要在Son类上增强一些功能怎么办...
  • chs0113
  • chs0113
  • 2016年05月06日 19:42
  • 6507

JAVA 中装饰器模式的实现

/* FilterInputStream.java -- Base class for classes that filter input 2: Copyright (C) 1998, 1...

java 装饰器模式

原文链接:http://chenhua-1984.iteye.com/blog/565629 记得以前听一个高手说java.io包采用了了装饰器模式,当时不是很明白什么事装饰器模式,现在,网上看...
  • liliiii
  • liliiii
  • 2014年04月12日 10:39
  • 831

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

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...

装饰器模式(Decorator)

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

【Java】装饰器模式

本文主要是介绍《【C++】装饰器模式》(点击打开链接)的Java版。关于什么是装饰器模式就不再赘述了,这次主要说明从UML类图是如何与代码联系起来的。 还是从2012年上半年软件设计师的软考题来说明...

对照java和spring理解python中单例模式的装饰器方法

python的对象管理机制与java思路不同,刚刚接触,对python的对象管理和反射(java才有)不太清楚。最近遇到了一个问题:在一个任务队列末端的worker不断监控队列中的消息,并执行相应的任...
  • gklifg
  • gklifg
  • 2016年04月08日 12:21
  • 755

JAVA-装饰器模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的:   装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代...

Java 装饰器设计模式

装饰器(Decorator)模式:      Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式;2.结构型模式;3.行为模式三种)。它的主要...
  • weiioy
  • weiioy
  • 2013年08月08日 14:46
  • 709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java装饰器模式
举报原因:
原因补充:

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