JAVA之裝飾者模式
阿新 • • 發佈:2019-01-25
一、裝飾者者模式簡介:
裝飾者模式:又名包裝模式,以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案;裝飾者模式以客戶端透明的方式動態的給一個物件附加更多的責任。換而言之,客戶端並不會覺得物件在裝飾者前與裝飾者後有什麼不同。
裝飾者模式可以在不創造更多子類的情況下,將物件的功能加以擴充套件。
裝飾者模式把客戶端的呼叫委派到被裝飾者類。
裝飾者模式的關鍵是在這種擴充套件完全是透明的。
裝飾者模式是在不必改變原類檔案和使用繼承的情況下,動態的擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾者來包裹真實的物件。
二、裝飾者模式的角色:
抽象構件角色(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