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设计模式初探之装饰者模式

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

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

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

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

转载 http://sishuok.com/forum/blogPost/list/5766.html22.1 场景问题22.1.1 复杂的奖金计算 考虑这样一个实际应用:就是如何实现灵活的...
  • lucas421634258
  • lucas421634258
  • 2015年11月16日 22:13
  • 738

装饰器模式(Decorator)

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

【Java】装饰器模式

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

Java IO : 流,以及装饰器模式在其上的运用

流概述 Java中,流是一种有序的字节序列,可以有任意的长度。从应用流向目的地称为输出流,从目的地流向应用称为输入流。 Java的流族谱 Java的java.io包中囊括了整个流...
  • huaweitman
  • huaweitman
  • 2016年01月20日 09:49
  • 1775

Java装饰器模式(Decorator)

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

JAVA 中装饰器模式的实现

/* FilterInputStream.java -- Base class for classes that filter input 2: Copyright (C) 1998, 1...
  • dajijidanaizi
  • dajijidanaizi
  • 2016年06月20日 17:24
  • 803

Java设计模式——装饰器模式(Decorator)

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加本领。而不管孙悟空怎么变化在二郎神眼里,他永远是那只猢狲。 装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任。 在孙悟空的例子里,...
  • fuyuwei2015
  • fuyuwei2015
  • 2015年05月18日 21:29
  • 697

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

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承关系的类:Father、Son、GrandSon,我们要在Son类上增强一些功能怎么办...
  • chs0113
  • chs0113
  • 2016年05月06日 19:42
  • 7355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java装饰器模式
举报原因:
原因补充:

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