装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变他的结构。它属于结构型模式,它作为先有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

2、例子
比如:孙悟空有 72 变,当他变成\"庙宇\"后,他的根本还是一只猴子,但是他又有了庙宇的功能。一般多用于扩展类的功能,同时可以达到动态扩展和动态撤销。

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

缺点:
多层装饰的话比较复杂。

4、代码

public class EntryptTest {

	public static void main(String[] args) throws Exception {
		//创建一个圆形
		Circle circle = new Circle();
		// 创建一个 圆形的装饰类
		RedShapeDecorator circleDecorator = new RedShapeDecorator(circle);
		//创建一个三角形的装饰类
		RedShapeDecorator rectangleDecorator = new RedShapeDecorator(new Rectangle());
		System.out.println(\"没有装饰的圆:\");
		circle.draw();
		System.out.println(\"装饰过后的圆形:\");
		circleDecorator.draw();
		System.out.println(\"装饰过后的三角形:\");
		rectangleDecorator.draw();
	}
}

//创建一个接口
interface Shape {
	void draw();
}

//创建两个实现类
class Rectangle implements Shape {

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

class Circle implements Shape {

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

//创建一个抽象的装饰类
abstract class ShapeDecorator implements Shape {
	protected Shape decoratedShape;

	public ShapeDecorator(Shape shape) {
		this.decoratedShape = shape;
	}

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

//创建扩展 一个具体的装饰类
class RedShapeDecorator extends ShapeDecorator{

	public RedShapeDecorator(Shape shape) {
		super(shape);
	}

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

	public void setRedBorder(){
		System.out.println(\"Border Color : red !\");
	}
}

分析:
我们将创建一个 Shape 接口和实现了 Shape 接口的circle,rectangle实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。
RedShapeDecorator 是实现了 ShapeDecorator 的实体类。
main方法中,演示了类使用 RedShapeDecorator 来装饰 Shape 对象。
\"在这里插入图片描述\"

收藏 打印