这篇文章我们开始总结第四种结构型模式,装饰模式。在日常的开发中我们可能会用到一些只有核心功能的类,但还需做更多的扩展功能来满足我们的需求,因此就产生了装饰模式。
定义
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
结构
- 抽象构建角色 :定义一个接口来接受带有附加职责的对象
- 具体构建 :实现抽象构建角色,用来做具体添加的一些职责
- 抽象装饰角色 :继承抽象构建,并包含具体构建的实例,其子类扩展具体构建的功能。
- 具体装饰角色 : 实现抽象装饰的相关方法,给出具体所需要添加的职责。
代码示例
public class MyDecoratorTest {
public static void main(String[] args){
Component component = new ComponentImp();
MyDecorator myDecorator = new MyDecorator(component);
myDecorator.function();
}
/**
* 定义抽象化构建角色
*/
interface Component{
void function();
}
/**
* 具体构建角色
*/
static class ComponentImp implements Component{
public ComponentImp(){
System.out.println("创建了具体构建角色 ComponentImp...");
}
@Override
public void function() {
System.out.println("调用了具体构建角色中的方法 function()...");
}
}
/**
* 抽象装饰角色
*/
static class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void function() {
System.out.println("调用了抽象装饰角色 Decorator 中的方法");
component.function();
}
}
/**
* 具体装饰角色
*/
static class MyDecorator extends Decorator{
public MyDecorator(Component component) {
super(component);
}
@Override
public void function() {
System.out.println("MyDecorator 开始添加新功能...");
super.function();
addFunction();
}
/**
* 添加的新功能
*/
public void addFunction(){
System.out.println("MyDecorator 新功能已添加...");
}
}
}
代码运行结果
创建了具体构建角色 ComponentImp...
MyDecorator 开始添加新功能...
调用了抽象装饰角色 Decorator 中的方法
调用了具体构建角色中的方法 function()...
MyDecorator 新功能已添加...
我们梳理一下装饰者模式的实现思路
- 第一步:定义一个抽象化构建角色
- 第二步:定义一个具体化构建角色,它是一个实现了抽象化构建角色的类
- 第三步:定义一个抽象装饰角色,它同样实现抽象化构建角色,但它的构造方法包含了对具体构建化角色的引用
- 第四步:定义一个具体装饰角色,它继承这个抽象化装饰角色,它就是真正实现新加功能的类。
看完前三步,有没有感觉到一丝丝熟悉,没错,前三步其实就是代理模式。在这个例子里,我们的抽象装饰角色Decorator其实就是具体构建角色ComponentImp的代理类,看完装饰者模式想必你也能够知道代理类和装饰模式的区别和相同点了。
优缺点
- 优点 :这种组合模式比纯粹使用继承方式方便很多;可以组合出很多种不同组合的具体装饰角色。
- 缺点 :当写了过多的具体装饰角色时,也就产生了大量的子类,会使代码看起来比较臃肿,变得更复杂。
网友评论