1. 程式人生 > >JAVA之裝飾者模式

JAVA之裝飾者模式

一、裝飾者者模式簡介:

裝飾者模式:又名包裝模式,以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案;裝飾者模式以客戶端透明的方式動態的給一個物件附加更多的責任。換而言之,客戶端並不會覺得物件在裝飾者前與裝飾者後有什麼不同。
裝飾者模式可以在不創造更多子類的情況下,將物件的功能加以擴充套件。
裝飾者模式把客戶端的呼叫委派到被裝飾者類。
裝飾者模式的關鍵是在這種擴充套件完全是透明的。
裝飾者模式是在不必改變原類檔案和使用繼承的情況下,動態的擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾者來包裹真實的物件。

二、裝飾者模式的角色:

抽象構件角色(Component):給出一個抽象類或者介面,定義出某些行為。
具體構件角色(Concrete Component):定義一個具體的物件,也就是 被裝飾者物件 實現或者繼承抽象構件角色。
裝飾者角色(Decorator):持有構件物件(被裝飾者)的引用, 實現或者繼承抽象構件角色。
具體裝飾者角色(Concrete Decorator):負責給物件加上附加的責任,也就是新增附加的功能。

三、裝飾者模式VS繼承:

裝飾者模式
1、用來擴充套件特定物件的功能
2、不需要建立子類
3、它是動態的
4、它在執行時分配職責
5、防止由於子類而導致的複雜和混亂
6、更多的靈活性
7、對於一個物件,同時可能有不同的裝飾者物件

繼承
1、用來擴充套件一類物件的功能
2、需要建立子類
3、它是靜態的
4、它在編譯時分配職責
5、導致產生很多的子類
6、缺乏靈活性

四、裝飾者模式的實現

下面舉個例子來演示裝飾者模式的實現,具體程式碼如下:

package com.guigu.decorator;
/**
 * 抽象構件角色  類似於我們io中的   outPutStream
 * @author
Administrator */
public interface Component { void doSomeThing(); }
package com.guigu.decorator;
/**
 * 具體的構件角色     被裝飾者的物件  由該類建立   類似於FileOutPutStream
 * @author Administrator
 *
 */
public class ConcreteComponent implements Component{

    @Override
    public void doSomeThing() {
        System.out.println("功能A"
); } }
package com.guigu.decorator;
/**
 * 裝飾者角色  類似於FilterOutputStream
 * @author Administrator
 *
 */
public class Decorator implements Component{

    private Component  component ;
    public  Decorator( Component  component) {
        this.component = component;
    }

    @Override
    public void doSomeThing() {
        component.doSomeThing();
    }
}
package com.guigu.decorator;
/**
 * 具體的裝飾者角色  類似於DataOutPutStream
 * @author Administrator
 *
 */
public class ConcreteDecorator extends Decorator{

    public ConcreteDecorator(Component component) {
        super(component);
    }

    @Override
    public void doSomeThing() {
        super.doSomeThing();
        doAnotherSomeThing();
    }

    private  void doAnotherSomeThing(){
        System.out.println("功能B");
    }
}
//測試類
package com.guigu.decorator;

import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Test {
public static void main(String[] args) throws FileNotFoundException{

        //DataOutputStream  dataOut = new DataOutputStream(new FileOutputStream("D:\\A.txt"));

        Component  component = new ConcreteComponent();
        ConcreteDecorator  decorator = new ConcreteDecorator(component);
        decorator.doSomeThing();

    }

}
//執行結果如下:
功能A
功能B