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
装饰器模式的“饰品”是热拔插的,可以独立增加核心功能,也可以独立增加附加功能,二者互不影响;可以在运行期动态地给核心功能增加任意个附加功能。
下面这个手抓饼的例子还加入了价格变化,能更好的理解装饰器的好处。
手抓饼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值