`
阅读更多

装饰者模式

    装饰者模式拥有一个设计非常巧妙的结构,它可以动态的添加对象的功能。在基本的设计原则中,有一条重要的设计原则,叫做 聚合复用 原则。故代码复用应尽可能使用委托,而不是继承。

    如果你对此模式没有了解,如是说可能会比较抽象。然而,在JAVA JDK的实现中,不少组件是通过装饰者模式实现的。其中,一个最典型的例子就是OutputStream与InputStream 类族的实现,以OutputStream为例:OutputStream对象提供的方法比较简单,但是通过各种装饰者的增强,OutputStream对象可以被赋予更多强大的功能。

 

    例如以下代码:

package com.zendly.mode.decorator;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class StreamDecorator {
	@SuppressWarnings("unused")
	public static void main(String[] args) throws FileNotFoundException {
		/*带有缓冲功能的输出流对象*/
		DataOutputStream dosBuffer = 
				new DataOutputStream(
						new BufferedOutputStream(
						new FileOutputStream(new File("D:/decorator.txt"))));
		/*没有缓冲功能的输出流对象*/
		DataOutputStream dosNoBuffer = 
				new DataOutputStream(
						new FileOutputStream(new File("D:/decorator.txt")));
	}
}
    以上几行代码中,第一种OutputStream加入了性能组件BufferedOutputStream,第二种则没有,因此,第一个OutputStream对象拥有更好的I/O性能。第一个OutputStream对象,在调用FileOutputStream.write()之前会先调用BufferedOutputStream.write(),查看BufferedOutputStream.write()源代码会发现,并不是每次调用此方法,它都会去磁盘写入数据,而是将数据写入缓存,当缓存满时,才会调用FileOutputStream.write(),实际写入数据。如此,实现了功能组件与性能组件的完美分离。

 

    装饰者模式一个典型的案例就是对输出结果进行增强。比如,现在我们要对某一内容结果通过HTML发布,首先,要将内容转化为HTML文本。同时,还要为内容添加HTTP头。一个简单的实现步骤如下:
    a.首先我们构造顶级业务接口IPacketCreator:
package com.zendly.mode.decorator;
/**
 * 顶级核心业务接口
 * @author zendly
 */
public interface IPacketCreator {
	public String dealContent();
}
 
    b.其次,就是我们的主要装饰者对象PacketDecorator:
package com.zendly.mode.decorator;
/**
 * PacketDecorator 维护核心组件creator
 * 它负责告知子类,核心业务逻辑应该委托IPacketCreator完成
 * PacketDecorator本身只作业务功能增强处理
 * @author zendly
 */
public abstract class PacketDecorator implements IPacketCreator{
	IPacketCreator creator;
	public PacketDecorator(IPacketCreator creator) {
		this.creator = creator;
	}
}
 
    c.然后,是我们的HTML具体装饰者对象PacketHTMLDecorator:
package com.zendly.mode.decorator;
/**
 * HTML文本的包装
 * @author zendly
 */
public class PacketHTMLDecorator extends PacketDecorator {

	public PacketHTMLDecorator(IPacketCreator creator) {
		super(creator);
	}

	@Override
	public String dealContent() {
		StringBuffer sb = new StringBuffer();
		sb.append("<html><body>");
		sb.append(creator.dealContent());
		sb.append("</body></html>\n");
		return sb.toString();
	}

}
 
    d.然后,是HTTP头具体装饰者对象PacketHTTPDecorator:
package com.zendly.mode.decorator;
/**
 * HTTP头内容的添加
 * @author zendly
 */
public class PacketHTTPDecorator extends PacketDecorator{

	public PacketHTTPDecorator(IPacketCreator creator) {
		super(creator);
	}

	@Override
	public String dealContent() {
		StringBuffer sb = new StringBuffer();
		sb.append("Connection:keep-alive\n");
		sb.append("Accept-Language:zh-CN,zh;q=0.8,en;q=0.6\n");
		sb.append("User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64)\n");
		sb.append(creator.dealContent());
		return sb.toString();
	}

}
 
    e.最后,使用这种方法UserDecorator:
package com.zendly.mode.decorator;

public class UserDecorator {
	public static void main(String[] args) {
		IPacketCreator pc = 
				new PacketHTTPDecorator(
						new PacketHTMLDecorator(
								new PacketCoreCreator()));
		System.out.println(pc.dealContent());
	}
}
 
分享到:
评论

相关推荐

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

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    装饰者模式Android实例

    装饰者模式是设计模式的一种,属于结构型模式,它的主要目的是动态地给对象添加新的行为或职责,而无需改变对象的原始代码。在Android开发中,装饰者模式的应用相当广泛,尤其是在视图组件的扩展和功能增强上。下面...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    java装饰者模式实现

    装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责,而不必修改原有代码,遵循“开闭原则”。在Java中,装饰者模式通常通过继承和组合来实现,尤其适用于那些...

    c# ,设计模式,装饰者模式,星巴兹咖啡

    装饰者模式是面向对象设计模式中的一个重要概念,它在C#等编程语言中广泛应用。这个例子以星巴克咖啡为例,展示了如何使用装饰者模式来灵活地扩展对象的功能,而无需修改原有代码。 装饰者模式的核心思想是动态地将...

    设计模式的装饰者模式的例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们可以在不改变对象原有结构的情况下,通过...

    Qt设计模式之装饰者模式

    **Qt设计模式之装饰者模式** 装饰者模式(Decorator Pattern)是软件设计模式中的结构型模式之一,它允许在运行时动态地给一个对象添加新的行为或职责,而无需修改对象本身。在Qt库中,装饰者模式也被广泛应用,...

    装饰者模式 C++ 实现

    装饰者模式是一种设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改对象本身的代码。在C++中实现装饰者模式,我们可以遵循以下步骤和关键概念: 1. **定义接口**:首先,我们需要定义一个基础...

    装饰者模式demo

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们的系统更加灵活,易于维护和扩展。 装饰...

    装饰者模式案例学习代码

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为和职责。这种模式在软件工程中广泛应用,因为它提供了一种灵活的方式来扩展对象的功能,而不会破坏其原有的结构。在Java、...

    装饰者模式的典型应用。

    装饰者模式是设计模式中的一种结构型模式,它在不改变对象原有行为的基础上,动态地为对象添加新的功能。这种模式常被用于扩展或增强对象的功能,而无需修改原对象的代码,符合“开闭原则”。在Java的SSL(Secure ...

    Headfirst(三)装饰者模式C++实现

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式在C++中的应用尤为广泛,因为它提供了灵活性,能够扩展对象的功能,同时保持代码的可读性和可维护性。 ...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    装饰者模式代码demo

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过将对象包装在一个装饰类中来实现,装饰类与原类有相同的接口,因此可以透明地替换或增强原有对象的...

    游戏设计3-装饰者模式-装备

    装饰者模式是面向对象设计中的一种行为设计模式,它允许在运行时动态地给对象添加新的职责或行为,而无需改变对象本身。在游戏设计中,装饰者模式常常被用来扩展角色、装备等对象的功能,使得游戏内容更加丰富且易于...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    设计模式之装饰者模式,内含可运行代码

    装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...

Global site tag (gtag.js) - Google Analytics