裝飾器模式是一種對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一種替代方案
裝飾類的排列組合
裝飾模式.png
利用裝飾類的排列組合可以產(chǎn)生不同效果,比繼承功能強(qiáng)大
雖然裝飾模式比繼承強(qiáng)大可以隨便排列組合,但是也容易出錯(cuò),比如弄個(gè)死循環(huán)或者奇葩的東東出來(lái)
合成模式的區(qū)別:
合成模式,樹型結(jié)構(gòu),分樹枝和樹葉,
和合成模式類似都是傳遞一個(gè)實(shí)現(xiàn)了共同接口的類進(jìn)去,
但是合成模式一般是樹枝包含很多個(gè)(所以它要add,remove等方法),這個(gè)裝飾模式就一個(gè)
裝飾模式可以為合成模式添加新的行為
裝飾模式和適配器模式的區(qū)別在于,裝飾器是為了增強(qiáng)所考慮對(duì)象的功能,
而適配器是為了改變所考慮對(duì)象的接口而不改變其功能-
代碼示例:
- 先定一個(gè)接口,抽象構(gòu)件角色,裝飾類和其他類都要實(shí)現(xiàn)
package com.byedbl.decorator;
/**
* The top abstract where concrete component and decorator
* should be derived from
*/
public interface Component {
void printString(String s);
}
- 定義一個(gè)實(shí)現(xiàn)類,
package com.byedbl.decorator;
/**
* A Concrete Component
*/
public class ConcreteComponent implements Component {
public ConcreteComponent() {
}
public void printString(String s) {
System.out.println("Input String is:" + s);
}
}
- 現(xiàn)在我們想對(duì)
ConcreteComponent
的功能進(jìn)行擴(kuò)展,利用裝飾模式,我們先定義一個(gè)裝飾類
package com.byedbl.decorator;
/**
* The Decorator
*/
public class Decorator implements Component {
private Component component;
public Decorator(Component c) {
component = c;
}
public void printString(String s) {
component.printString(s);
}
}
- 實(shí)現(xiàn)一種裝飾
package com.byedbl.decorator;
/**
* The Concrete Decorator
*/
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component c) {
super(c);
}
public void printString(String s) {
super.printString(s);
printStringLen(s);
}
public void printStringLen(String s) {
System.out.println("The length of string is:" + s.length());
}
}
- 實(shí)現(xiàn)另外一種裝飾類
package com.byedbl.decorator;
/**
* The Concrete Decorator
*/
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component c) {
super(c);
}
public void printString(String s) {
super.printString(s);
printStringLen(s);
}
public void printStringLen(String s) {
System.out.println("BBBBBBBBBBBBBBBBBBB");
}
}
- 然后客戶端就可以隨意的排列組合產(chǎn)生不同的功能了
package com.byedbl.decorator;
/**
* <pre>
* A simple test
* 利用裝飾類的排列組合可以產(chǎn)生不同效果,比繼承功能強(qiáng)大
*
* 合成模式的區(qū)別:
* 合成模式,樹型結(jié)構(gòu),分樹枝和樹葉,
* 和合成模式類似都是傳遞一個(gè)實(shí)現(xiàn)了共同接口的類進(jìn)去,
* 但是合成模式一般是樹枝包含很多個(gè)(所以它要add,remove等方法),這個(gè)裝飾模式就一個(gè)
*
* 裝飾模式可以為合成模式添加新的行為
*
* 裝飾模式比繼承強(qiáng)大可以隨便排列組合,但是也容易出錯(cuò),比如弄個(gè)死循環(huán)或者奇葩的東東出來(lái)
*
* 裝飾模式和適配器模式的區(qū)別在于,裝飾器是為了增強(qiáng)所考慮對(duì)象的功能,
* 而適配器是為了改變所考慮對(duì)象的接口而不改變其功能
*
*/
public class Test1 {
public static void main(String[] args) {
Component myComponent = new ConcreteComponent();
myComponent.printString("A test String");
Decorator myDecorator = new ConcreteDecoratorA(myComponent);
myDecorator.printString("A test String");
myDecorator = new ConcreteDecoratorB(myDecorator);
myDecorator.printString("B test String");
}
}
輸出:
Input String is:A test String
Input String is:A test String
The length of string is:13
Input String is:B test String
The length of string is:13
BBBBBBBBBBBBBBBBBBB
實(shí)例有:JDK源碼IO部分
image.png