如何動(dòng)態(tài)地給一個(gè)類(lèi)增加功能?
哈嘍,大家好,我是指北君。
今天給大家介紹另一種常用的設(shè)計(jì)模式——裝飾器模式。
1.什么是裝飾器模式?
Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.
裝飾器模式(Decorator Pattern):動(dòng)態(tài)的給一個(gè)對(duì)象添加額外的職責(zé),就增加功能來(lái)說(shuō), 裝飾模式相比生成子類(lèi)更為靈活。
說(shuō)人話(huà):一般的,我們?yōu)榱藬U(kuò)展一個(gè)類(lèi)經(jīng)常使用繼承方式實(shí)現(xiàn),隨著擴(kuò)展功能的增多,子類(lèi)會(huì)很膨脹。這時(shí)候期望在不改變類(lèi)對(duì)象及其類(lèi)定義的情況下,為對(duì)象添加額外功能,這就是裝飾器模式。
2.裝飾器模式定義
①Component抽象構(gòu)件
Component是一個(gè)接口或者是抽象類(lèi), 就是定義我們最核心的對(duì)象, 也就是最原始的對(duì)象。
②ConcreteComponent 具體構(gòu)件
ConcreteComponent是最核心、 最原始、 最基本的接口或抽象類(lèi)的實(shí)現(xiàn), 你要裝飾的就是它。
③Decorator裝飾角色
一般是一個(gè)抽象類(lèi), 實(shí)現(xiàn)接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的屬性里必然有一個(gè)private變量指向Component抽象構(gòu)件。
④ConcreteDecorator 具體裝飾角色
ConcreteDecoratorA和ConcreteDecoratorB是兩個(gè)具體的裝飾類(lèi), 你要把你最核心的、 最原始的、 最基本的東西裝飾成其他東西
3.裝飾器模式通用代碼實(shí)現(xiàn)
/**
* 抽象構(gòu)件
*/
public abstract class Component {
public abstract void operator();
}
/**
* 具體構(gòu)件
*/
public class ConcreteComponent extends Component{
@Override
public void operator() {
System.out.println("doSomething");
}
}
/**
* 抽象裝飾者
*/
public abstract class Decorator extends Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
// 委托給被修飾者執(zhí)行
@Override
public void operator() {
this.component.operator();
}
}
public class ConcreteDecorator1 extends Decorator{
// 定義被修飾者
public ConcreteDecorator1(Component component){
super(component);
}
// 定義自己的修飾方法
public void method1(){
System.out.println("修飾方法 method1");
}
@Override
public void operator() {
this.method1();
super.operator();
}
}
客戶(hù)端測(cè)試:
public class DecoratorClient {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修飾
component = new ConcreteDecorator1(component);
// 第二次修飾
component = new ConcreteDecorator2(component);
// 修飾后運(yùn)行
component.operator();
}
}
打印結(jié)果:
4.裝飾器模式優(yōu)點(diǎn)
①裝飾模式可以動(dòng)態(tài)地?cái)U(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能。
②裝飾類(lèi)和被裝飾類(lèi)可以獨(dú)立發(fā)展, 而不會(huì)相互耦合。換句話(huà)說(shuō), Component類(lèi)無(wú)須知道Decorator類(lèi), Decorator類(lèi)是從外部來(lái)擴(kuò)展Component類(lèi)的功能, 而Decorator也不用知道具體的構(gòu)件。
③裝飾模式是繼承關(guān)系的一個(gè)替代方案。我們看裝飾類(lèi)Decorator, 不管裝飾多少層, 返回的對(duì)象還是Component, 實(shí)現(xiàn)的還是is-a的關(guān)系
5.裝飾器模式應(yīng)用場(chǎng)景
①、需要擴(kuò)展一個(gè)類(lèi)的功能, 或給一個(gè)類(lèi)增加附加功能。
②、需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能, 這些功能可以再動(dòng)態(tài)地撤銷(xiāo)。