`

设计模式:装饰器模式

阅读更多

装饰器模式可以动态地向一个已经存在的对象实例添加额外其他的功能。下面,用一个简单的小例子——打扮你的女友,来讲解装饰器模式。

1、装饰器小故事

假设你正在找一个妹子,这些妹子可能来自不同的国际,例如,America, China, Japan, France, 等等。她们也有不同的个性和习惯。在一个(像百合网)相亲的网站上,如果每一种类型的妹子都是各不相同的Java类的话,这可就有成千上万个类了。这是一个非常严重的问题叫做类爆炸(class explosion)。而且,当有新的妹子类型,新的类需要创建时,这种设计是不可扩展的。

 

我们改变下原来的设计,让每一种个性或者习惯变成一种装饰,可以动态的应用到每一个妹子上。

2、类图



 Girl是一个最顶端的抽象类,Girls来自不同的国家。基于这个GirlDecorate类,我们可以通过添加新的装饰器来装饰任何一种特征到每一个Girl上。

3、实例代码

Girl抽象类

public abstract class Girl {
	String description = "no particular";
 
	public String getDescription(){
		return description;
	}
}

 AmericanGirl.java

public class AmericanGirl extends Girl {
	public AmericanGirl(){
		description = "+American";
	}
}

 EuropeanGirl.java

public class EuropeanGirl extends Girl {
	public EuropeanGirl() {
		description = "+European";
	}
}

 GirlDecorator.java

public abstract class GirlDecorator extends Girl {
	public abstract String getDescription();
}

 Science.java

public class Science extends GirlDecorator {
 
	private Girl girl;
 
	public Science(Girl g) {
		girl = g;
	}
 
	@Override
	public String getDescription() {
		return girl.getDescription() + "+Like Science";
	}
 
	public void caltulateStuff() {
		System.out.println("scientific calculation!");
	}
}

 我们可以毫无限制的给每一个装饰器添加更多的方法如“Dance()”。

Art.java

public class Art extends GirlDecorator {
 
	private Girl girl;
 
	public Art(Girl g) {
		girl = g;
	}
 
	@Override
	public String getDescription() {
		return girl.getDescription() + "+Like Art";
	}
 
	public void draw() {
		System.out.println("draw pictures!");
	}
}

 Main.java

package designpatterns.decorator;
 
public class Main {
 
	public static void main(String[] args) {
		Girl g1 = new AmericanGirl();
		System.out.println(g1.getDescription());
 
		Science g2 = new Science(g1);
		System.out.println(g2.getDescription());
 
		Art g3 = new Art(g2);
		System.out.println(g3.getDescription());
	}
}

 输出:

+American
+American+Like Science
+American+Like Science+Like Art

我们也可以这样写:

Girl g = new Science(new Art(new AmericanGirl()));

 4、实际应用

典型的用到装饰器模式的就是Java IO classes。

一个简单的例子 – BufferedReader decorates InputStreamReader。

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object

 

InputStreamReader(InputStream in) – bridge from byte streams to character streams. InputSteamReader reads bytes and translates them into characters using the specified character encoding.

BufferedReader(Reader in) – read text from a character stream and buffer characters in order to provide efficient reading methods(e.g., readLine())

 

  • 大小: 52.7 KB
分享到:
评论

相关推荐

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

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

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    设计模式分为三类:创建型模式(如单例模式、工厂方法模式)、结构型模式(如代理模式、装饰器模式)和行为型模式(如观察者模式、策略模式)。每种模式都有其特定的用途和适用场景。 4. **具体设计模式详解** - ...

    设计模式:基于C#的工程化实现及扩展(完整电子版)

    这些模式在不同的开发环境中都展现出其价值,包括单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、建造者模式等。 在C#中,我们可以利用面向对象的特性,如类、接口和继承,来实现这些设计模式。例如,...

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

    例如责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    设计模式:可复用的面向对象软件的基础

    - 装饰模式:为游戏对象动态增加功能,如给角色动态增加装甲或魔法效果等; - 代理模式:用于控制对游戏资源的访问,如延迟加载或异步加载资源。 通过应用设计模式,游戏引擎开发者能够更好地实现软件的复用性、可...

    设计模式:可复用面向对象软件设计基础(附源码)

    2. **结构型模式**:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式关注如何将类或对象以某种方式组合起来,以实现新的功能或改善现有结构。 3. **行为型模式**:包括责任...

    Python 程序语言设计模式思路-结构型模式:装饰器讲解及利用Python装饰器模式实现高效日志记录和性能测试

    装饰器模式(Decorator Pattern)是结构型设计模式之一,用于动态地向对象添加额外的职责,而不影响其他对象。这种模式通过使用装饰器函数,允许你在保持原始功能的基础上,灵活地扩展代码的行为。

    设计模式-装饰器模式

    装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...

    1.《设计模式:可复用面向对象软件的基础(完整书签)》

    2. 结构型模式(Structural Patterns):这类模式关注类和对象的组合,以形成更复杂的结构,例如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)...

    JAVA设计模式学习12——装饰器模式

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

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

    ## 一、概述 装饰器模式允许在不修改对象现有... - 在面向对象编程中,装饰器模式是一种设计模式,它允许静态或动态地向单个对象添加行为,而不会影响同一类的其他对象的行为。装饰器模式通常对于遵循单一职责原则非

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

    19. 迭代器模式:迭代器模式提供了一种方法顺序访问集合对象的元素,而又不暴露其底层表示。 20. 访问者模式:访问者模式在不修改对象结构的前提下,增加新的操作功能。 以上设计模式在实际开发中都有广泛的应用,...

    设计模式 - 装饰模式(C++实例)

    在实现中,装饰器模式通常遵循以下步骤: 1. 定义组件接口。 2. 创建原始组件类,实现接口。 3. 创建装饰器类,包含对组件的引用,并实现组件接口。 4. 创建具体装饰器类,扩展装饰器类,添加新的行为。 5. 在客户端...

    c++设计模式-结构型模式-装饰器模式

    c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

    设计模式可复用面向对象软件的基础(c++).pdf

    - **第4章 结构型模式**:涵盖了用于组合类和对象以形成更大的结构的模式,如适配器模式、装饰器模式等,它们提供了一种方式来组装系统组件,使得系统架构更加清晰和模块化。 - **第5章 行为模式**:探讨了用于定义...

    设计模式可复用面向对象软件的基础 源码

    在《设计模式:可复用面向对象软件的基础》一书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(通常被称为GoF,Gang of Four)详细阐述了23种经典的设计模式。这些模式分为三类:创建型模式、...

Global site tag (gtag.js) - Google Analytics