裝飾者模式又叫包裝模式,他能夠以透明的方式擴(kuò)展對(duì)象的功能,是繼承方式的另外一種替代方案。和代理模式很相似,但在對(duì)被裝飾的對(duì)象的控制程度是不同的;裝飾者模式是對(duì)對(duì)象功能的加強(qiáng),而代理模式是對(duì)對(duì)象施加控制,并不提供對(duì)對(duì)象本身功能的加強(qiáng)。
首先看下裝飾者模式的類圖
說(shuō)明下:
Component,給出一個(gè)抽象接口,規(guī)范實(shí)現(xiàn)類的一些方法;
ConcreteComponent:具體的一個(gè)組件,實(shí)現(xiàn)了接口方法;
Decorator:抽象的裝飾者,對(duì)接口的一個(gè)引用,在 method 方法里面使用這個(gè)引用完成任務(wù);(代理模式需要實(shí)例化)
ConcreteDecorator:具體的裝飾者,對(duì)抽象裝飾者的抽象部分進(jìn)行實(shí)現(xiàn)
下面給出實(shí)現(xiàn)代碼
抽象組件接口:
public interface Component {
public void method();
}
具體組件的實(shí)現(xiàn)代碼:
public class ConcreteComponent implements Component {
@Override
public void method() {
System.out.println("我是一個(gè)具體干活的類");
}
}
抽象的裝飾者:
public abstract class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component=component;
}
@Override
public void method() {
first();
component.method();
end();
}
public abstract void first();
public abstract void end();
}
具體的裝飾者:
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void first() {
System.out.println("開(kāi)始需求調(diào)研");
}
@Override
public void end() {
System.out.println("項(xiàng)目收尾工作");
}
}
最后測(cè)試下:
public class Client {
public static void main(String[] args) {
Component c=new ConcreteComponent();
Component decorator = new ConcreteDecorator(c);
decorator.method();
}
}
最終結(jié)果是:
開(kāi)始需求調(diào)研
我是一個(gè)具體干活的類
項(xiàng)目收尾工作
如果有多個(gè)具體裝飾者,可以互相嵌套包裹,如下,新增一個(gè)具體裝飾者
public class ConcreteDecorator2 extends Decorator{
public ConcreteDecorator2(Component component) {
super(component);
}
@Override
public void first() {
System.out.println("開(kāi)始設(shè)計(jì)");
}
@Override
public void end() {
System.out.println("項(xiàng)目確認(rèn)驗(yàn)收");
}
}
在客戶端修改為:
public class Client {
public static void main(String[] args) {
Component c=new ConcreteComponent();
Component decorator = new ConcreteDecorator(c);
Component decorator2 = new ConcreteDecorator2(decorator);
decorator2.method();
}
}
最終結(jié)果:(順序貌似反了,包裝包反了)
開(kāi)始設(shè)計(jì)
開(kāi)始需求調(diào)研
我是一個(gè)具體干活的類
項(xiàng)目收尾工作
項(xiàng)目確認(rèn)驗(yàn)收
這樣來(lái)看包裹模式更加形象真實(shí)了。
裝飾者模式可以演變一種更加直觀的,就是沒(méi)有 Component 抽象組件,抽象裝飾者直接繼承某個(gè)類,對(duì)這個(gè)類進(jìn)行裝飾。
還可以把抽象裝飾與具體裝飾合二為一,對(duì)功能簡(jiǎn)單的可以這樣優(yōu)化處理。
另外:透明是指對(duì)抽象進(jìn)行編程,比如上面的Component c=new ConcreteComponent();``Component decorator = new ConcreteDecorator(c);
這些前端 Component
,而不是具體的 ConcreteComponent
和ConcreteDecorator
。