1、什么是裝飾器模式?
Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.
裝飾器模式(Decorator Pattern):動態(tài)的給一個對象添加額外的職責,就增加功能來說, 裝飾模式相比生成子類更為靈活。
說人話:一般的,我們?yōu)榱藬U展一個類經(jīng)常使用繼承方式實現(xiàn),隨著擴展功能的增多,子類會很膨脹。這時候期望在不改變類對象及其類定義的情況下,為對象添加額外功能,這就是裝飾器模式。
2、裝飾器模式定義
①、Component抽象構(gòu)件
Component是一個接口或者是抽象類, 就是定義我們最核心的對象, 也就是最原始的對象。
②、ConcreteComponent 具體構(gòu)件
ConcreteComponent是最核心、 最原始、 最基本的接口或抽象類的實現(xiàn), 你要裝飾的就是它。
③、Decorator裝飾角色
一般是一個抽象類, 實現(xiàn)接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的屬性里必然有一個private變量指向Component抽象構(gòu)件。
④、ConcreteDecorator 具體裝飾角色
ConcreteDecoratorA和ConcreteDecoratorB是兩個具體的裝飾類, 你要把你最核心的、 最原始的、 最基本的東西裝飾成其他東西
3、裝飾器模式通用代碼實現(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();
}
}
public class ConcreteDecorator2 extends Decorator{
// 定義被修飾者
public ConcreteDecorator2(Component component){
super(component);
}
// 定義自己的修飾方法
public void method2(){
System.out.println("修飾方法 method2");
}
@Override
public void operator() {
super.operator();
this.method2();
}
}
客戶端測試:
public class DecoratorClient {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修飾
component = new ConcreteDecorator1(component);
// 第二次修飾
component = new ConcreteDecorator2(component);
// 修飾后運行
component.operator();
}
}
打印結(jié)果:
4、裝飾器模式優(yōu)點
①、裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能。
②、裝飾類和被裝飾類可以獨立發(fā)展, 而不會相互耦合。換句話說, Component類無須知道Decorator類, Decorator類是從外部來擴展Component類的功能, 而Decorator也不用知道具體的構(gòu)件。
③、裝飾模式是繼承關(guān)系的一個替代方案。我們看裝飾類Decorator, 不管裝飾多少層, 返回的對象還是Component, 實現(xiàn)的還是is-a的關(guān)系
5、裝飾器模式應(yīng)用場景
①、需要擴展一個類的功能, 或給一個類增加附加功能。
②、需要動態(tài)地給一個對象增加功能, 這些功能可以再動態(tài)地撤銷。
-
接口
+關(guān)注
關(guān)注
33文章
8497瀏覽量
150835 -
代碼
+關(guān)注
關(guān)注
30文章
4748瀏覽量
68354
發(fā)布評論請先 登錄
相關(guān)推薦
評論