`

设计模式回顾之六:装饰者模式(Decorator)

 
阅读更多

设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------

装饰者模式:

动态地给一个对象添加职责,可以无需创建子类,而扩展一个对象的功能。

适用情景:各种可选的功能在另一个肯定要执行的功能之前或者之后执行。

实现:创建一个抽象类来表示原类和要添加到这个类的新功能。在装饰类中,将对新功能的调用放在对紧随其后对象的调用之前或之后,以获得正确的顺序。

举例:在类使用时如果有多种组合情况时,例如:蛋糕类 -> 奶油蛋糕、巧克力蛋糕、果仁蛋糕、奶油巧克力蛋糕、奶油果仁蛋糕.....如果为每一种组合都建立一个子类的话,则需要很多子类,这时可以考虑装饰者模式。

 

程序实现:

接口:

public interface Work {
	public void working();
}

原始实现类:

public class Programmer implements Work{
	public void working() {
		System.out.println("编写程序中...");
	}
}

装饰类1:

public class ProgrammerDecorator implements Work{
	private Work work;
	
	public ProgrammerDecorator(Work work){
		this.work = work;
	}
	public void working() {
		designing();
		work.working();//装饰顺序可变...
		debuging();
	}
	//新增加的装饰性方法:设计程序
	public void designing(){
		System.out.println("设计程序中...");
	}
	//新增加的装饰性方法:修改Bug
	public void debuging(){
		System.out.println("修改Bug中...");
	}
}

装饰类2:

public class TeamLeaderDecorator implements Work{
	private Work work;
	
	public TeamLeaderDecorator(Work work){
		this.work=work;
	}
	public void working() {
		allotTasks();
		work.working();
	}
	//分配任务
	public void allotTasks(){
		System.out.println("分配任务");
	}
}

程序入口:

public static void main(String[] args) {
		Work programmer=new Programmer();
		System.out.println("未被装饰时:");
		programmer.working();//未被装饰时
		System.out.println();
		
		System.out.println("单重装饰后:");
		ProgrammerDecorator pd=new ProgrammerDecorator(programmer);
		pd.working();
		System.out.println();
		
		System.out.println("多重装饰后:");
		TeamLeaderDecorator tld=new TeamLeaderDecorator(new ProgrammerDecorator(programmer));
		tld.working();
	}

 

举例:IO类库大量使用了装饰者模式,例如BufferedReader包装FileReader、BufferedInputStream包装FileInputStream等等,实现动态地给对象添加职责。

分享到:
评论

相关推荐

    《设计模式:可复用面向对象软件的基础》英文版

    如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰者模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)等。 - **行为型模式**:关注于对象间的职责分配,...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    在第25讲中,他集中对整个系列进行了一次全面的总结,让我们一起来回顾和探讨这些设计模式的核心要点。 设计模式是经过实践验证的、在特定场景下解决常见问题的最佳解决方案。它们是面向对象设计的智慧结晶,通过...

    C#设计模式.PDF

    在本章节中,作者可能会回顾面向对象编程的基本概念,如封装、继承、多态等,并为后面介绍的设计模式奠定理论基础。 ### 2. 设计模式举例 这部分内容将通过具体的例子来介绍设计模式的应用场景,帮助读者理解不同...

    java设计模式迷你手册.rar

    Java设计模式迷你手册是一部浓缩了Java编程领域中设计模式精华的参考书,旨在帮助开发者理解和应用这些模式,提升代码质量和可维护性。设计模式是软件工程中...总之,掌握Java设计模式是提升编程技能的关键步骤之一。

    设计模式解析习题解答,已经做好目录标签

    - 第17章的装饰者模式(Decorator Pattern)可以在不改变对象接口的情况下动态地添加新的行为或责任。 - 第18章的观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有...

    精典设计模式

    《精典设计模式》文档包含了丰富的软件开发中的设计模式知识,涵盖了C++和C#两种主流编程语言的应用。设计模式是解决软件设计中常见问题的经验总结...定期回顾和实践设计模式,将使你在软件开发的道路上更加得心应手。

    侯捷2015设计模式课件-同济

    首先,设计模式课件回顾了面向对象编程(Object-Oriented Programming,OOP)的基本原则,如封装、继承和多态,这些是设计模式依赖的基础。 接下来,课程深入讨论了GoF的设计模式。这些模式可以分为三类: 1. 创建...

    C#设计模式大全

    在深入探讨设计模式之前,我们首先回顾C#中的面向对象特性: 1. **封装**:通过将数据和操作这些数据的方法封装在一个类中来实现。 2. **继承**:允许创建一个新的类继承现有类的属性和行为。 3. **多态**:同一个...

    11-回顾和总结(1).html

    在书中,作者们将这二十三种设计模式分成了三类,分别是创建型模式、结构型模式和行为型模式。 创建型模式包含了: 工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ...

    追MM与23种设计模式

    装饰者模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。在“追MM”的过程中,装饰者模式可以帮助你在现有基础上增加额外的追求方式,例如通过送花、写信等方式增强感情的表达。...

    算法导论 DesignPatterns Gof

    本书主要分为六个部分,涵盖了设计模式的基本概念、案例研究、以及三种类型的设计模式(创建型模式、结构型模式、行为型模式)。 ##### 1.1 什么是设计模式? 设计模式是一种在特定情境下解决常见问题的模板。它...

    design-patterns-learn:设计模式学习

    对于经验丰富的开发者,它可以作为回顾和巩固设计模式知识的工具。 总之,"设计模式学习"项目旨在帮助开发者掌握Java设计模式,提高编程技巧,以便在实际开发过程中写出更高质量、更具弹性的代码。通过深入学习并...

    DesignPatterns:回顾在软件体系结构和设计课程中看到的设计模式

    8. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。装饰模式提供了比继承更多的灵活性,避免了对类的大量修改。 9. 外观模式(Facade Pattern):为一个复杂的子系统提供一个简单的接口,...

    Design Patterns Java Workbook - Addison Wesley

    ### 设计模式在Java开发中的应用 #### 一、引言 《Design Patterns Java Workbook》是一本面向中级至高级Java开发者的重要参考书籍。本书由Steve Metsker撰写,并于2002年由Addison Wesley出版社出版。它以一种实践...

    以轻松的语言比喻了java的23种模式

    装饰者模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式是作为现有的类的一个包装。 **比喻理解:** 假设你和MM出去约会,你想给她一个惊喜。你可以事先...

    DesignPattern.rar

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的..."DesignPattern.rar"提供了一个全面学习设计模式的机会,无论你是初学者还是经验丰富的开发者,都应该深入探究,不断提升自己的编程素养。

Global site tag (gtag.js) - Google Analytics