Bridge橋接設計模式是將一組功能(實現)與另一組使用該功能的其他對象(行爲)分離開來,以便達到單一因素變化,然後使用對象調用的方式將這兩組關聯繫起來,將問題的行爲和實現分離開來實現,通過用聚合代替繼承來解決子類爆炸性增長的問題。 Bridge橋接設計模式結構如下:
還是以畫圖爲例演示Bridge橋接設計模式,例子代碼如下:
- //行爲
- interface Shape{
- public void doDraw();
- }
- class Circle implements Shape{
- private Drawing draw
- public Circle(Drawing draw){
- this.draw = draw;
- }
- public void doDraw(){
- draw.draw();
- }
- }
- class Rectangle implements Shape{
- private Drawing draw
- public Rectangle(Drawing draw){
- this.draw = draw;
- }
- public void doDraw(){
- draw.draw();
- }
- }
- //實現
- interface Drawing{
- public void draw();
- }
- class SolidDrawing implements Drawing{
- public void draw(){
- System.out.println(“Drawing solide line…”);
- }
- }
- class DashDrawing implements Drawing{
- public void draw(){
- System.out.println(“Drawing dash line…”);
- }
- }
- public class BridgeDemo{
- public static void main(String[] args){
- //畫一個實線的圓
- Drawing draw1 = new SolidDrawing();
- Shape shape1 = new Circle(draw1);
- shape1.doDraw();
- //畫一個虛線的矩形
- Drawing draw2 = new DashDrawing();
- Shape shape2 = new Rectangle(draw2);
- shape2.doDraw();
- }
- }
只從上面的例子代碼可能還無法完全理解Bridge橋接設計模式,上面的圓形和矩形是行爲,而實線畫法和虛線畫法則是實現,行爲接口Shape通過聚合方式引用實現接口Drawing從而達到了行爲和實現的橋接。如果需要增加第三種圖形三角形,則不會影響實現部分。如果增加第三種畫法折線畫法,則不會影響圖形行爲部分,將行爲與實現鬆耦合分離。當系統有兩個可變因素時,即問題行爲和問題實現都在變化時,傳統實現方式可能組合情況太多造成類爆炸,適合使用橋樑模式。
學習設計模式的人經常分不清Bridge橋接設計模式和Strategy策略設計模式,個人感覺兩者簡單的區別如下:
(1).Bridge橋接設計模式中不但實現可以變化,問題行爲也是可以變化的,且兩者的變化是相互獨立的,在兩個維度都存在變化情況下優先考慮使用橋接模式。
(2).Strategy策略設計模式中,僅僅存在算法實現策略的變化,問題行爲是不變的,即僅有一個維度的變化。另外策略模式中考慮的算法層次的變化,是無狀態,無數據的。
JDK中橋接模式的應用:
一、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結尾的文件;
- package org.exam5a;
- import java.io.File;
- import java.io.FilenameFilter;
- public class T4 {
- public static void main(String[] args)throws Exception {
- File f = new File(".");
- MyFilter filter = new MyFilter(".java");
- String[] files = f.list(filter);
- for(String a:files){
- System.out.println(a);
- }
- }
- static class MyFilter implements FilenameFilter{
- private String type;
- public MyFilter(String type){
- this.type = type;
- }
- public boolean accept(File dir,String name){
- return name.endsWith(type);
- }
- }
- }