装饰器模式
(Decorator Pattern):动态地
给一个对象添加
一些额外的职责
。这种模式提供了一种灵活的方式来扩展
对象的功能
,而不需要修改原始类的代码
通常有以下角色:
角色1.抽象组件
(Component):定义对象的基本接口
。
角色2.具体组件
(Concrete Component):实现抽象组件的具体类
。
角色3.抽象装饰器
(Decorator):继承抽象组件
,用于添加额外功能
。
角色4.具体装饰器
(Concrete Decorator):实现抽象装饰器,具体添加
特定的功能。
优点
包括:
1.灵活性
:可以在运行时动态地添加或移除
功能。
2.可扩展性
:无需修改原始
类,就能添加新的装饰器
。
3.复用性
:可以重复使用
装饰器来构建不同
的功能组合
。
4.独立性
:装饰器与具体类解耦
,更易于测试和维护。
应用场景
:
1.扩展性需求
:当需要在不修改现有代码的基础上,为对象添加新的功能或行为时。
2.功能组合
:可以将多个装饰器组合在一起,以构建复杂的功能。
3.动态配置
:在运行时根据具体情况动态地添加或移除装饰器。
4.独立扩展
:不同的装饰器可以独立进行扩展和修改,互不影响。
5.性能优化
:通过添加装饰器来优化对象的性能。
例如
:
1.图形界面组件
:可以为组件添加边框、颜色、阴影等装饰。
2.文件操作
:如添加加密、压缩等功能
。
3.数据库操作
:例如添加日志记录、性能监控等
。
4.网络通信
:如添加数据加密、协议转换等。
5.游戏角色
:为角色添加各种技能或特效。
示例
:定义了一个Component接口,它有一个operation方法。然后我们创建了一个具体的组件ConcreteComponent,它实现了Component接口。
接着,我们定义了一个Decorator抽象类,它同样实现了Component接口,并持有一个Component类型的成员变量。Decorator类的operation方法会委托给这个成员变量。
之后,我们创建了两个具体的装饰器ConcreteDecoratorA和ConcreteDecoratorB,它们都继承自Decorator类,并且各自添加了不同的行为。
最后具体整合测试
//定义组价接口
public interface Component {
void operation();
}
// 定义具体组件
public class ConcreteComponent implements Component{
@Override
public void operation() {
System.out.println("ConcreteComponent operation executed.");
}
}
// 定义装饰器抽象类
public class Decorator implements Component{
protected Component component; // 被装饰的对象
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
// 定义具体装饰器A
public class ConcreteDecoratorA extends Decorator{
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
addedBehavior(); // 添加的行为
}
private void addedBehavior() {
System.out.println("ConcreteDecoratorA added behavior executed.");
}
}
// 定义具体装饰器B
public class ConcreteDecoratorB extends Decorator{
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation(){
super.operation();
anotherAddedBehavior(); // 另一个添加的行为
}
private void anotherAddedBehavior() {
System.out.println("ConcreteDecoratorB added behavior executed.");
}
}
//具体整合测试
public class DecoratorPatternDemo {
public static void main(String[] args) {
Component component=new ConcreteComponent();
Component decoratorA=new ConcreteDecoratorA(component);
Component decoratorB=new ConcreteDecoratorB(decoratorA);
decoratorB.operation();
}
}