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

概述

装饰器模式(Decorator Pattern),允许向一个已有的对象添加新功能,同时又不改变其结构,属于结构型模式。
它是作为现有类的一个包装。
装饰器模式是在不改变原类文件和使用继承的基础上,动态扩展一个对象的功能。它通过创建一个包装对象,也就是装饰来包裹真实的对象。
这种模式创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。
意图:动态为一个对象添加额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
主要解决:由于使用继承会为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
使用场景:在不增加很多子类的情况下扩展类。
关键代码:Component类充当抽象角色,不具体实现。装饰类引用和继承Compoment类,具体扩展类重写父类方法。

实例

创建一个Shape接口和实现该接口的实体类,然后创建一个实现Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量。
创建Shape接口

public interface Shape {
	void draw();
}

创建Shape接口的实现类
Circle类

public class Circle implements Shape {
	public void draw() {
		System.out.println("圆形。。");
	}
}

Rectangle类

public class Rectangle implements Shape {
	public void draw() {
		System.out.println("矩形。。");
	}
}

创建实现Shape接口的抽象装饰类ShapeDecorator

public abstract class ShapeDecorator implements Shape {
	protected Shape decoratedShape;
	
	public ShapeDecorator(Shape decoratedShape) {
		this.decoratedShape = decoratedShape;
	}

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

创建扩展了ShapeDecorator的实体装饰类

public class RedShapeDecorator implements ShapeDecorator {
	public RedShapeDecorator(Shape decoratedShape) {
		super(decoratedShape);
	}

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

	private void setRedBorder(Shape decoratedShape) {
		System.out.println("红色边框。。。");
	}
}

测试类

public class DecoratorPatternDemo {
	public static void main(String[] args) {
		Shape circle = new Circle();
		Shape redCircle = new RedShapeDecorator(new Circle());
		Shape redRectangle = new RedShapeDecorator(new Rectangle());

		System.out.println("普通边框圆形:");
		circle.draw();
		System.out.println("-------------------");

		System.out.println("红色边框圆形:");
		redCircle.draw();
		System.out.println("-------------------");

		System.our.pintln("红色边框矩形:");
		redRectangle.draw();
	}
}

输出结果
在这里插入图片描述

总结

装饰器模式的特点
不改变原类文件,不使用继承,动态扩展。
与桥接模式的区别
两个模式都是为了解决过多子类对象问题,但两者诱因不同。桥接模式是对象自身现有机制沿着多个维度变化,是既有的部分不稳定。
装饰器模式是为增加新的功能。
与适配器模式的区别
适配器模式其实也是一种包装模式,适配器模式的意义是将一个接口转换成另一个接口,目的是通过改变接口来达到复用的目的。装饰器模式不需改变被装饰的接口,恰恰是要保持原有的接口,增强原有接口的功能,或改变原有对象的处理方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值