java设计模式之装饰器模式(附源码)

本文通过艺术字修饰的例子详细介绍了装饰器模式的应用。该模式允许在不改变对象结构的前提下动态地给对象添加新的职责。文中提供了Java实现的具体代码,并通过手抓饼的例子进一步解释了其灵活性。

装饰器(Decorator)模式:一种在运行期动态给某个对象的实例增加功能的方法。
Java提供的工具包中,IO相关工具就普遍大量使用了装饰器模式。
举一个艺术字的例子。
定义文本节点接口

public interface TextNode {
	void setText(String text);
	String getText();
}

定义一个抽象的文本修饰器

public abstract class NodeDecorator implements TextNode {

	protected final TextNode target;
	
	protected NodeDecorator(TextNode target) {
		this.target = target;
	}
	@Override
	public void setText(String text) {
		this.target.setText(text);
	}
}

实际修饰器,span标签修饰

public class SpanNode implements TextNode {

	private String text;

	@Override
	public void setText(String text) {
		this.text = text;
	}
	@Override
	public String getText() {
		return "<span>" + text + "</span>";
	}
}

斜体修饰

public class ItalicDecorator extends NodeDecorator {

	public ItalicDecorator(TextNode target) {
		super(target);
	}

	@Override
	public String getText() {
		return "<i>" + target.getText() + "</i>";
	}
}

加粗修饰

public class BoldDecorator extends NodeDecorator {

	public BoldDecorator(TextNode target) {
		super(target);
	}

	@Override
	public String getText() {
		return "<b>" + target.getText() + "</b>";
	}
}

测试

public class Test {
	public static void main(String[] args) throws IOException {
		TextNode n1 = new SpanNode();
		TextNode n2 = new BoldDecorator(new UnderlineDecorator(new SpanNode()));
		TextNode n3 = new ItalicDecorator(new BoldDecorator(new SpanNode()));
		n1.setText("Hello");
		n2.setText("Decorated");
		n3.setText("World");
		System.out.println(n1.getText());
		System.out.println(n2.getText());
		System.out.println(n3.getText());
	}
}

运行结果:

<span>Hello</span>
<b><u><span>Decorated</span></u></b>
<i><b><span>World</span></b></i>

代码库:https://gitee.com/SlienceDemo/java-ee.git
装饰器模式的“饰品”是热拔插的,可以独立增加核心功能,也可以独立增加附加功能,二者互不影响;可以在运行期动态地给核心功能增加任意个附加功能。
下面这个手抓饼的例子还加入了价格变化,能更好的理解装饰器的好处。
手抓饼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值