Bridge設計模式 + FilenameFilter總結

Bridge橋接設計模式是將一組功能(實現)與另一組使用該功能的其他對象(行爲)分離開來,以便達到單一因素變化,然後使用對象調用的方式將這兩組關聯繫起來,將問題的行爲和實現分離開來實現,通過用聚合代替繼承來解決子類爆炸性增長的問題。 Bridge橋接設計模式結構如下:


還是以畫圖爲例演示Bridge橋接設計模式,例子代碼如下:

  1. //行爲  
  2. interface Shape{  
  3. public void doDraw();  
  4. }  
  5. class Circle implements Shape{  
  6.     private Drawing draw  
  7.     public Circle(Drawing draw){  
  8.     this.draw = draw;  
  9. }  
  10. public void doDraw(){  
  11.     draw.draw();  
  12. }  
  13. }  
  14. class Rectangle implements Shape{  
  15.     private Drawing draw  
  16.     public Rectangle(Drawing draw){  
  17.     this.draw = draw;  
  18. }  
  19. public void doDraw(){  
  20.     draw.draw();  
  21. }  
  22. }  
  23. //實現  
  24. interface Drawing{  
  25.     public void draw();  
  26. }  
  27. class SolidDrawing implements Drawing{  
  28.     public void draw(){  
  29.     System.out.println(“Drawing solide line…”);  
  30. }  
  31. }  
  32. class DashDrawing implements Drawing{  
  33.     public void draw(){  
  34.     System.out.println(“Drawing dash line…”);  
  35. }  
  36. }  
  37. public class BridgeDemo{  
  38.     public static void main(String[] args){  
  39.     //畫一個實線的圓  
  40.     Drawing draw1 = new SolidDrawing();  
  41.     Shape shape1 = new Circle(draw1);  
  42.     shape1.doDraw();  
  43. //畫一個虛線的矩形  
  44.     Drawing draw2 = new DashDrawing();  
  45.     Shape shape2 = new Rectangle(draw2);  
  46.     shape2.doDraw();  
  47. }  
  48. }  

只從上面的例子代碼可能還無法完全理解Bridge橋接設計模式,上面的圓形和矩形是行爲,而實線畫法和虛線畫法則是實現,行爲接口Shape通過聚合方式引用實現接口Drawing從而達到了行爲和實現的橋接。如果需要增加第三種圖形三角形,則不會影響實現部分。如果增加第三種畫法折線畫法,則不會影響圖形行爲部分,將行爲與實現鬆耦合分離。當系統有兩個可變因素時,即問題行爲和問題實現都在變化時,傳統實現方式可能組合情況太多造成類爆炸,適合使用橋樑模式。

學習設計模式的人經常分不清Bridge橋接設計模式和Strategy策略設計模式,個人感覺兩者簡單的區別如下:

(1).Bridge橋接設計模式中不但實現可以變化,問題行爲也是可以變化的,且兩者的變化是相互獨立的,在兩個維度都存在變化情況下優先考慮使用橋接模式。

(2).Strategy策略設計模式中,僅僅存在算法實現策略的變化,問題行爲是不變的,即僅有一個維度的變化。另外策略模式中考慮的算法層次的變化,是無狀態,無數據的。


JDK中橋接模式的應用:

AWT
JDBC

一、FilenameFilter介紹


java.io.FilenameFilter是文件名過濾器,用來過濾不符合規格的文件名,並返回合格的文件;

一般地:

(1)String[] fs = f.list();

(2)File[] fs = f.listFiles();

這兩個方法返回f下的所有文件或目錄;

FilenameFilter用來把符合要求的文件或目錄返回;

因此可以調用:

(1)String []fs = f.list(FilenameFilter filter);;

(2)File[]fs = f.listFiles(FilenameFilter filter);


二、文件名過濾器一般用法


1.實現FilenameFilter接口;

2.實現boolean accept(File dir,String name);   //dir表示文件的當前目錄,name表示文件名;

class MyFilter implements FilenameFilter{

private String type;            //type爲需要過濾的條件,比如如果type=".jpg",則只能返回後綴爲jpg的文件

public MyFilter(String type){

this.type = type;

}

public boolean accept(File dir,String name){           //返回true的文件則合格

}

}


三、實例    


要求:返回當前目錄下所有以.java結尾的文件;

  1. package org.exam5a;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5.   
  6. public class T4 {  
  7.   
  8.     public static void main(String[] args)throws Exception {  
  9.         File f = new File(".");  
  10.         MyFilter filter = new MyFilter(".java");  
  11.         String[] files = f.list(filter);  
  12.         for(String a:files){  
  13.             System.out.println(a);  
  14.         }  
  15.     }  
  16.     static class MyFilter implements FilenameFilter{  
  17.         private String type;  
  18.         public MyFilter(String type){  
  19.             this.type = type;  
  20.         }  
  21.         public boolean accept(File dir,String name){  
  22.             return name.endsWith(type);  
  23.         }  
  24.     }  


發佈了54 篇原創文章 · 獲贊 3 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章