装饰器模式

原创 2018年04月17日 20:11:28

装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

 

优点:

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:

多层装饰比较复杂。

使用:

1.扩展一个类的功能。

2.动态增加功能,动态撤销。


实现代码
public interface IShape {
	void draw();
}

public class Circle implements IShape {

	@Override
	public void draw() {
		System.out.println("Shape: Circle");
	}

}

public class Rectangle implements IShape {

	@Override
	public void draw() {
		System.out.println("Shape: Rectangle");
	}
}

public abstract class ShapeDecorator implements IShape {
	protected IShape decoratedShape;

	public ShapeDecorator(IShape decoratedShape) {
		this.decoratedShape = decoratedShape;
	}

	public void draw() {
		decoratedShape.draw();
	}
}

public class RedShapeDecorator extends ShapeDecorator {

	public RedShapeDecorator(IShape decoratedShape) {
		super(decoratedShape);
	}

	public void draw() {
		decoratedShape.draw();
		setRedBorder(decoratedShape);
	}

	private void setRedBorder(IShape decoratedShape) {
		System.out.println("Border Color: Red");
	}

}

public class Test {

	public static void main(String[] args) {

		IShape circle = new Circle();

		IShape redCircle = new RedShapeDecorator(new Circle());

		IShape redRectangle = new RedShapeDecorator(new Rectangle());
		
		
//		System.out.println("Circle with normal border");
//		circle.draw();

		System.out.println("\nCircle of red border");
		redCircle.draw();

//		System.out.println("\nRectangle of red border");
//		redRectangle.draw();
	}

}

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式。查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/...
  • daguanjia11
  • daguanjia11
  • 2015-06-03 06:12:03
  • 4508

设计模式 —— 装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)概念 装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的。...
  • wwh578867817
  • wwh578867817
  • 2016-05-23 11:46:16
  • 1982

再议:装饰器模式和代理模式的区别

在典型的例子上,两者是非常好区分的。如spring的AOP、远程代理类、JDK的proxy,都是代理模式。JDK里的输入/输出器是很典型的装饰器模式!  但在有些场景上,对设计模式入门的新手,还是有...
  • bigtree_3721
  • bigtree_3721
  • 2016-03-10 00:12:05
  • 1103

javascript设计模式之装饰器模式(结构型模式)

javascript设计模式之装饰器模式js的设计模式分为创建型模式,结构型模式和行为模式结构模式描述了如何组合对象以提供新的功能。装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础,...
  • a31017799
  • a31017799
  • 2017-05-02 15:11:15
  • 512

[设计模式]-装饰器模式(Decorator)

定义: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 对象结构型模式...
  • qust_2011
  • qust_2011
  • 2016-11-30 19:15:04
  • 781

JAVA IO之装饰器模式(Head first 设计模式之装饰器模式)

InputStream是IO中装饰器模式的顶层,现在我们讨论一下装饰器模式。顾名思义,动态的将责任附加到对象上,如要扩展功能,装饰者提供了比继承更加有弹性的方案。 装饰器模式:首先,装饰者和被装饰者...
  • wangzhenfei444
  • wangzhenfei444
  • 2016-06-20 16:01:03
  • 1075

代理模式和装饰器模式的区别

之前了解过“代理模式”,最经典的例子就是“房屋中介”,房东是被代理对象(也称为真实对象),中介公司是代理对象,共同实现同一个接口,而租房子的家伙就是客户端调用者。租房狗调用一个租房接口,实现自己的租房...
  • DavidPeterMan
  • DavidPeterMan
  • 2016-09-11 11:02:06
  • 317

装饰器模式详解(与IO不解的情缘)

装饰器模式详解(与IO不解的情缘)                  作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,...
  • wxl1234579
  • wxl1234579
  • 2016-10-08 13:48:09
  • 171

Java 装饰器模式详解

转载请注明出处: 在上面的几篇文章中,着重介绍了java 中常见的`IO` 相关知识,在学习的过程中,发现IO包中是用了大量的装饰器模式,为了彻底的学习IO,今天就来揭开装饰器模式的面纱。 为...
  • zhaoyanjun6
  • zhaoyanjun6
  • 2017-02-22 16:22:14
  • 509

装饰器模式以及继承的应用场景

最近,看到有朋友在吐槽,说在用redis的client库jedis的连接池的时候,得到的jedis的实例,调用close方法之后,不能回到池里面,而是真的关闭了连接。为什么大家会觉得调用close方法...
  • linsongze2011
  • linsongze2011
  • 2017-01-22 09:45:14
  • 1040
收藏助手
不良信息举报
您举报文章:装饰器模式
举报原因:
原因补充:

(最多只允许输入30个字)