设计模式-装饰模式
# 设计模式-装饰模式
# 概述
对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温暖、更实用。在软件设计中也有一种类似新房装修的技术可以对已有对象的功能进行扩展。
装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。
# 定义
在软件设计中,装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。
**装饰模式:**动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。
# 装饰模式结构
装饰模式主要包含以下角色。
- 抽象构件(Component):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象。
- 具体构件(ConcreteComponent):是抽象构建类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法。
- 抽象装饰(Decorator):也是抽象构件类的子类,用于给具体构件增加职责,但是具体职称在其子类中实现。
- 具体装饰(ConcreteDecorator):是抽象装饰类的子类,负责向构件添加新的职责。
# 装饰模式应用案例
1、创建图形接口
public interface Shape {
/**
* 画图
*/
void draw();
}
2、创建实现接口的实体类
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
3、创建实现了Shape接口的抽象装饰类
public class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
4、创建扩展ShapeDecorator类的实体装饰类
public class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
5、案例实现
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 with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
// 输出
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red
Process finished with exit code 0
# 装饰模式优缺点
优点:
- 对于扩展一个对象的功能,装饰模式比继承更加灵活,不会导致类的个数急剧增加。
- 可以通过一种动态的方式来扩展一个对象的功能。
- 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合可以创造出很多不同行为的组合,得到功能更加强大的对象。
- 具体构建类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构建类和具体装饰类。
缺点:
- 在使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值不同,大量小对象的产生势必会占用更多的系统资源,在一定程度上影响程序的性能。
- 装饰模式提供了一种比继承更加灵活、机动的解决方案,但同时也意味着比继承更加容易出错,排错也更困难。
# 装饰模式使用环境
- 在不影响其他对象的情况下以动态、透明的方式给单个对象添加职责。
- 动态增加功能,动态撤销。
# 参考
Java设计模式
上次更新: 2024/06/29, 15:13:44