1. 程式人生 > >設計模式學習之裝飾模式:IO流的裝飾器

設計模式學習之裝飾模式:IO流的裝飾器

IO流的裝飾器

題目分析:通過對javaio系列類分析得知,javaio流使用了設計模式中的裝飾模式,以動態的給一個物件增加職責,能夠更加靈活的增加功能。通過看io的原始碼得知FilterOutputStream類繼承了OutputStream類並擁有父類的一個物件,它和父類具有組合聚合的關係。因此要實現我們自己的加密類只需擴充套件FilterOutputStream類重寫它的wite方法即可

UML圖:

原始碼:

package com.cmc
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
//加密類,擴充套件了FilterOutputStream 類並重寫了write方法
public class EncryptOutputStream extends FilterOutputStream {
	public EncryptOutputStream(OutputStream out) {
		super(out);
	}
	public void write(int arg) throws IOException {
        arg += 2;
        if (arg >= 97 + 26) {
            arg = arg - 26;
        }
        super.write(arg);
    }
}
package com.cmc;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
//客戶端測試
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		OutputStream os = null;
		try {
			os = new EncryptOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File("text.txt"))));
			os.write("qwerty".getBytes());
			os.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

執行後text.txt中的內容為:sygtv 

 優點

           1、裝飾者模式可以提供比繼承更多的靈活性

           2、可以通過一種動態的方式來擴充套件一個物件的功能,在執行時選擇不同的裝飾器,從而實現不同的行為。

           3、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一物件,得到功能更為強大的物件。

           4、具體構件類與具體裝飾類可以獨立變化,使用者可以根據需要增加新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有程式碼無須改變,符合“開閉原則”。

  缺點

           1、會產生很多的細粒度物件,增加了系統的複雜性

           2、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易於出錯,排錯也很困難,對於多次裝飾的物件,除錯時尋找錯誤可能需要逐級排查,較為煩瑣。

出現問題:javaio流概念較難理解

解決辦法:檢視javaio包下的原始碼,並查閱API瞭解它的繼承關係