`

java装饰器模式

    博客分类:
  • java
 
阅读更多

java装饰器模式

意图:动态的将责任附加到对象上
什么时候使用:
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设计模式学习12——装饰器模式

    在Java中,`InputStream`和其相关的装饰类(如`BufferedInputStream`、`DataInputStream`)就是很好的装饰器模式示例。`InputStream`是组件接口,`FileInputStream`等是具体组件,而`BufferedInputStream`则是一个...

    装饰模式小猪快跑游戏模拟

    ConcreteDecorator则是具体的装饰类,如“红苹果装饰器”、“绿苹果装饰器”,它们负责为小猪添加特定的能力,如加速或者跳跃。 在"shiyan5"这个压缩包中,可能包含了实现这些角色的源代码文件。例如,可能会有...

    54-Spring设计模式之装饰器模式1

    Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...

    Java装饰器设计模式_动力节点Java学院整理

    Java 装饰器设计模式 Java 装饰器设计模式是一种动态给对象添加额外职责的设计模式,通过在运行时添加新的行为,而不是在编译时继承的方式达到功能的扩充。这种模式可以使得系统更加灵活、可维护和可扩展。 首先,...

    java实现装饰器模式(Decorator Pattern)

    Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的...

    设计模式--装饰者模式java例子

    1. **组件(Component)**:定义了对象的接口,也就是所有被装饰对象和装饰器对象必须共同遵循的公共行为。这个接口使得装饰者和被装饰的对象可以互换,实现了无缝对接。 2. **具体组件(Concrete Component)**:...

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

    Java 设计模式 - 装饰器模式 装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或...

    JAVA设计模式之装饰模式代码

    4. 具体装饰器(Concrete Decorator):是装饰器的实现,负责给具体组件添加新的职责。具体装饰器可以有多个,每个都可以添加不同的行为。 在"JAVA设计模式之装饰模式代码"的示例中,我们可能会看到以下类结构: -...

    Java设计模式之装饰器模式.docx

    【Java设计模式之装饰器模式】装饰器模式是一种结构型设计模式,它的主要目的是在不修改已有对象的前提下,通过添加额外的职责来扩展对象的功能。这种模式遵循单一职责原则,使得扩展职责时不会破坏原有对象的结构。...

    【Java设计模式-源码】装饰器模式:动态扩展类的功能

    装饰器模式允许在不修改对象现有代码的情况下,动态地为对象添加职责。它通过提供一种将对象“包裹”在具有类似接口的对象中的方式来实现这一点,增强了Java设计模式的灵活性。 ## 二、详细解释及实际示例 1. **...

    装饰器模式

    在Java中,装饰器模式通常涉及到接口或抽象类,以及它们的实现类。基础接口或抽象类定义了对象的核心行为,而装饰者类则实现了相同的接口或继承了相同的抽象类,以便于与原始对象无缝协作。装饰者通常持有一个对被...

    java装饰者模式实现

    4. **具体装饰者(Concrete Decorator)**:这是装饰器模式的核心,每个具体装饰者都为组件增加了一些新的行为,如加糖装饰者。 ```java public class SugarDecorator extends Decorator { public SugarDecorator...

    50丨装饰器模式:通过剖析JavaIO类库源码学习装饰器模式1

    在Java IO类库中,装饰器模式被广泛使用,以灵活地扩展类的功能,而避免了使用继承带来的复杂性。装饰器模式的核心在于,它定义了一个与组件接口相同的接口,因此可以在运行时动态地将责任附加到对象上。 在Java IO...

    java 装饰模式

    4. 具体装饰器(Concrete Decorator):实现抽象装饰器中的方法,可以增加新的属性或行为,或者增强原有组件的能力。 例如,假设我们有一个`Coffee`类作为具体组件,它提供了一些基本的咖啡服务,如热咖啡。然后,...

    Java IO 与 装饰模式

    使用装饰模式时,首先创建一个基础的流对象,然后根据需求选择合适的装饰器对其进行包装。例如,如果我们需要从文件中读取数据并进行缓冲处理,可以这样操作: ```java InputStream in = new FileInputStream("file....

    java装饰模式及动态代理模式示例源码

    例如,在数据库连接池中,我们可以创建一个基础的数据库连接类,然后通过装饰器类来添加连接池管理的能力,如连接的获取、释放、池化等。 动态代理模式,另一方面,是行为型设计模式,主要用于在运行时动态创建代理...

    java设计模式之装饰者模式代码

    在Java中,装饰者模式通常涉及到继承和接口的使用。装饰者模式的核心思想是,定义一个抽象组件接口(Component),然后创建一个实现了这个接口的类(ConcreteComponent)。接着,创建一个抽象装饰者接口(Decorator...

    java装饰模式

    // 使用装饰器模式计算奖金 BasePrize prizeCalculator = new BasePrize("张三") { @Override public double calcPrize(Date begin, Date end) { // 基础奖金计算逻辑 return 0.0; } }; prizeCalculator = new...

Global site tag (gtag.js) - Google Analytics