版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slh2016/article/details/85034780
装饰器模式
定义:用于替代继承,无需通过继承增加子类就能扩展对象的新功能。
作用:用于包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。
优劣:
- 优点:
- 装饰类和被装饰类可以独立发展,不会耦合,装饰器模式是继承的一个替代方案,实现动态扩展功能。
- 缺点:
- 多层装饰比较复杂
与代理模式区别:
装饰器模式是为了增强功能,而代理模式是为了加以控制
用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例,客户对真实对象不可见。
当我们使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器,来对原有对象进行功能扩展。
使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
应用实例:Java IO设计
示意图:
类说明:
- Shape:图形接口
- Circle:实体类1
- Rectangle:实体类2
- ShapeDecorator:实现了Shape接口的抽象装饰类,Shape对象为其实例对象
- RedShapeDecorator,BoldShapeDecorator:实现了ShapeDecorator类的功能扩展实体类
- 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();
}
}
执行结果:
---------画圆----------
画圆形图片
---------画圆并涂红色----------
画圆形图片
给图形涂上红色
----------画图并边框加粗---------
画圆形图片
给图形边框加粗
----------画图,然后涂红色,最后边框加粗---------
画圆形图片
给图形涂上红色
给图形边框加粗
----------画图,然后边框加粗,最后涂红色---------
画圆形图片
给图形边框加粗
给图形涂上红色