設計模式學習之裝飾模式:IO流的裝飾器
阿新 • • 發佈:2019-02-06
IO流的裝飾器
題目分析:通過對java的io系列類分析得知,java的io流使用了設計模式中的裝飾模式,以動態的給一個物件增加職責,能夠更加靈活的增加功能。通過看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、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易於出錯,排錯也很困難,對於多次裝飾的物件,除錯時尋找錯誤可能需要逐級排查,較為煩瑣。
出現問題:java的io流概念較難理解
解決辦法:檢視java的io包下的原始碼,並查閱API瞭解它的繼承關係