1. 程式人生 > >java裝飾者模式

java裝飾者模式

裝飾者模式(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