装饰器模式:在不改变类结构的情况下,增添一部分新功能。
传统的装饰器模式基于继承实现,其中它主要包含以下几部分:
- 抽象构件:规范职责
- 具体构件:实现抽象构件
- 抽象装饰:实现抽象构件,并包含具体构件实例,通过其子类扩展具体构件的功能
- 具体装饰: 继承抽象装饰,实体具体增强方法
代码结构如下:
interface Component {
void operation();
}
class ConcreteComponent implements Component {
public ConcreteComponent() {
System.out.println("具体构件角色被创建");
}
@Override
public void operation() {
System.out.println("调用具体构件角色 operation() 方法");
}
}
class AbstractDecorator implements Component {
private Component component;
public AbstractDecorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
class ConcreteDecorator extends AbstractDecorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
addedFunction();
}
public void addedFunction() {
System.out.println("为具体构件角色额外增加的方法:addedFunction()");
}
}
从结果可以看出,装饰器模式和代理模式很像,都是为了增强功能,但从设计初衷来说,两种包含以下区别:
- 装饰器类的创建基于具体实现对象,也就是说需要增强哪个对象,再传哪个对象,而代理模式代理类中对象的创建在构造方法中进行,无须选择对象。也就是说:装饰器模式重点在于增强哪个对象,而代理模式重点在于具体增强方法的实现,两者侧重点不同。
其它层面来分析多少有点咬文嚼字,这里我们不再展开。总得来说,设计模式只是设计代码的一种规范,并没有明确的界限和区别,无论代理还是装饰器,系统中哪个好用,更符合预期效果就用哪个,没有必须分个高低出来