装饰模式
概述
装饰模式是一种用来代替继承的技术,通过无需定义子类的方式给对象动态的添加职责,使对象之间的关联关系取代类之间的继承关系。装饰模式降低了代码中的耦合度,我们可以动态的增加或删除对象的职责,使得本质功能和装饰功能都可以独立变化,符合开闭原则。
构成
- Component抽象构件。它是具体构件和装饰构件的共同父类,声明了客户端中使用及子类需要实现的方法。
- ConcreteComponent具体构件。抽象构件的子类,实现了抽象构件声明的业务方法,有具体的职责。
- Decorator抽象装饰类。抽象构件的子类,它维护了一个指向具体构件的引用,可以调用具体构建中实现的业务方法。
- ConcreteDecorator具体装饰类。抽象装饰类的子类,负责为具体构件添加新的职责,它的业务方法中调用了具体构件的业务方法,并且实现了其他新的功能。
实例
package decorator;
public interface Component {
public void show();
}
package decorator;
public class TextBox implements Component {
@Override
public void show() {
System.out.println("显示文本框");
}
}
package decorator;
public abstract class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void show() {
component.show();
}
}
package decorator;
public class ColorDecorator extends Decorator {
public ColorDecorator(Component component) {
super(component);
}
@Override
public void show() {
System.out.println("设置背景颜色为蓝色");
super.show();
}
}
package decorator;
public class Client {
public static void main(String[] args) {
Component component = new ColorDecorator(new TextBox());
component.show();
}
}
//设置背景颜色为蓝色
//显示文本框
透明装饰模式和半透明装饰模式
- 透明装饰模式。透明装饰模式中完全针对接口编程,客户端可以像使用具体构件类一样的使用装饰构建类,并且可以对已经获取的构件对象进行多次装饰。
- 半透明装饰模式。半透明装饰模式区分具体构件和装饰构件,可以使用装饰构件的自定义方法,灵活性高,但是只能进行一次装饰。
优点
- 装饰模式通过取代继承实现增加功能的需求,使得代码的耦合性降低。
- 我们可以动态的为具体构件添加新的功能,降低了类的个数。
- 具体构件类和装饰构件类可以独立变化,增加新的构件和和具体装饰类不会对其他部分产生影响,符合开闭原则。
适用场景
- 在不影响其他对象的情况下以动态的、透明的方式给单个对象添加功能。
- 不能使用继承对功能进行扩展。