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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slh2016/article/details/85034780

装饰器模式

定义:用于替代继承,无需通过继承增加子类就能扩展对象的新功能。

作用:用于包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。

优劣:

  1. 优点:
    • 装饰类和被装饰类可以独立发展,不会耦合,装饰器模式是继承的一个替代方案,实现动态扩展功能。
  2. 缺点:
    • 多层装饰比较复杂

与代理模式区别:

装饰器模式是为了增强功能,而代理模式是为了加以控制

用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例,客户对真实对象不可见。

当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器,来对原有对象进行功能扩展。

使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。

应用实例:Java IO设计

示意图:
在这里插入图片描述

类说明:

  1. Shape:图形接口
  2. Circle:实体类1
  3. Rectangle:实体类2
  4. ShapeDecorator:实现了Shape接口的抽象装饰类,Shape对象为其实例对象
  5. RedShapeDecorator,BoldShapeDecorator:实现了ShapeDecorator类的功能扩展实体类
  6. DecoratorDemo:测试主类

示例:

package designPattern.decorator;

public interface Shape {
	
	void draw();
	
}

package designPattern.decorator;

public class CircleShape implements Shape{

	@Override
	public void draw() {
		System.out.println("画圆形图片");
	}

}

package designPattern.decorator;

public class RectangleShape implements Shape{

	@Override
	public void draw() {
		System.out.println("画矩形图片");
	}

}

package designPattern.decorator;

public abstract class ShapeDecorator implements Shape{

	protected Shape shape;
	
	public ShapeDecorator(Shape shapeDecorator) {
		this.shape = shapeDecorator;
	}
	
	public void draw() {
		shape.draw();
	}
	
}

package designPattern.decorator;

public class RedShapeDecorator extends ShapeDecorator{

	public RedShapeDecorator(Shape shapeDecorator) {
		super(shapeDecorator);
	}
	
	@Override
	public void draw() {
		super.draw();
		setRedColor();
	}
	
	void setRedColor() {
		System.out.println("给图形涂上红色");
	}

}

package designPattern.decorator;

public class BoldShapeDecorator extends ShapeDecorator{

	public BoldShapeDecorator(Shape shapeDecorator) {
		super(shapeDecorator);
	}
	
	@Override
	public void draw() {
		super.draw();
		setBoldBorder();
	}
	
	void setBoldBorder() {
		System.out.println("给图形边框加粗");
	}
}

package designPattern.decorator;

public class DecoratorDemo {

	public static void main(String[] args) {
		System.out.println("---------画圆----------");
		CircleShape shape = new CircleShape();// 圆
		// Shape shape = new RectangleShape();// 矩形
		shape.draw();
		System.out.println("---------画圆并涂红色----------");
		Shape redShape = new RedShapeDecorator(shape);
		redShape.draw();
		System.out.println("----------画图并边框加粗---------");
		Shape boldShape = new BoldShapeDecorator(shape);
		boldShape.draw();
		System.out.println("----------画图,然后涂红色,最后边框加粗---------");
		Shape redThanBoldShape = new BoldShapeDecorator(new RedShapeDecorator(shape));
		redThanBoldShape.draw();
		System.out.println("----------画图,然后边框加粗,最后涂红色---------");
		Shape boldThanRedShape = new RedShapeDecorator(new BoldShapeDecorator(shape));
		boldThanRedShape.draw();
		
	}

}

执行结果:

---------画圆----------
画圆形图片
---------画圆并涂红色----------
画圆形图片
给图形涂上红色
----------画图并边框加粗---------
画圆形图片
给图形边框加粗
----------画图,然后涂红色,最后边框加粗---------
画圆形图片
给图形涂上红色
给图形边框加粗
----------画图,然后边框加粗,最后涂红色---------
画圆形图片
给图形边框加粗
给图形涂上红色

猜你喜欢

转载自blog.csdn.net/slh2016/article/details/85034780