java裝飾者模式
阿新 • • 發佈:2018-11-27
裝飾者模式(Decorator),又叫包裝者模式(wapper)
意圖:動態地給一個物件新增一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
因為參考網上說法都不太一樣,故按照我理解的意思描述下裝飾者模式,以希望給後來者一些稍微的指引:
通俗地說就是包裝物件,在不影響其他物件的情況下,動態,透明地給單個物件新增一些功能
裝飾模式就是給一個物件增加一些新的功能,而且是動態的,要求裝飾物件和被裝飾物件實現同一個介面,裝飾物件持有被裝飾物件的例項,如圖:
需要幾個部件:
1介面,或者抽象類
2被裝飾者實現該介面,或者繼承該抽象類
3裝飾者實現該介面,或者繼承該抽象類,定義被裝飾物件的例項,對該例項進行進行包裝
以常見的io介面類來說
抽象類InputStream
public abstract class InputStream implements Closeable
抽象類InputStream的子類FileInputStream,被裝飾者
public class FileInputStream extends InputStream
抽象類InputStream的子類FilterInputStream,裝飾者
public class FilterInputStream extends InputStream protected volatile InputStream in; //定義抽象類InputStream的例項,下行的構造方法中把這個例項傳過來 protected FilterInputStream(InputStream in) { this.in = in; }
FilterInputStream的子類BufferedInputStream,繼承了父類的裝飾功能
public class BufferedInputStream extends FilterInputStream
所以會有這樣的語句:BufferedInputStream對InputStream的例項進行包裝
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("G:\\x269all.rmvb")); BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("G:\\x256.rmvb"));
自定義包裝類:
介面:
public interface DrinkDecorator {
void add();
}
實現類,被包裝者
public class Coffee implements DrinkDecorator {
public void add() {
System.out.println("add some coffee ");
System.out.println("add some water");
}
}
實現類,包裝者:
public class SweetCoffee implements DrinkDecorator {
Coffee coffee;
public SweetCoffee(Coffee coffee) {
this.coffee = coffee;
}
public void add() {
coffee.add();
System.out.println("add some sugar");
System.out.println("this is a sweet coffee");
}
}
測試類:
public class DecoratorTest {
public static void main(String[] args) {
SweetCoffee sc = new SweetCoffee(new Coffee());
sc.add();
}
}
out:
add some coffee
add some water
add some sugar
this is a sweet coffee