設計模式-橋接模式
橋接模式(bridge pattern),對應英文名稱可以是bridge或者bradge任意一種都可以。
在軟體系統中,某些型別由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種「多維度的變化」?如何利用物件導向的技術來使得該型別能夠輕鬆的沿著多個方向進行變化,而又不引入額外的複雜度?這就要使用bridge模式。
假設現在我現在要引入hp這個產品,而hp下不但和pc和server還有printer,
如果按抽象工廠模式中那篇文章的方式來劃分,首先在pc類別和server類別中加入hp,然後再增加乙個printer類,下面包括三個品牌
pc包括(dell、ibm、hp)
server包括(dell、ibm、hp)
printer包括(dell、ibm、hp)
看可以看到**量是成指數方式增長,看來此方案不可取。
現在我們加入乙個品牌類來管理,比如brand(dell,ibm,hp),然後dell(pc、server、printer),其它的以此類推,我們先來看下uml模型圖
或者各種產品加入乙個裝置類來管理,比如machine(pc、server、printer),然後pc(dell、ibm、hp),其它的以此類推,我們來看下uml模型圖
我們看到現在這個繼承關係變得更加複雜,那麼姑且先不說程式**數量的增加,後期如果再引入新的元素時,程式將會變得難以維護。
下面我們將使用另一種方式來劃分,先看下按此方式劃分的uml模型圖
通過uml模型圖我們可以到在bran和mahine之間建立起了一座橋梁,這主是本篇文章開頭提到的橋接模式。
設計模式carp原則告訴我們類與類之間盡量使用合成/聚合關係,少用繼承關係,以便更大程度的降低類與類之間的偶合關係。
品牌brand(dell、ibm、hp)
裝置machine(pc、server、printer)
下面我們來看下具體實現**
品牌基類
abstract class brand
public virtual string name set }
public abstract void describe();
protected machine machine;//新增對machine的引用或者說關聯
public void setmachine(machine machine)//操作裝置: pc,server,printer...
public abstract void on();
public abstract void off();
}
具休品牌
class dell : brand
public override void describe()
brand", name);
}public override void on()
public override void off()
}
class ibm : brand
public override void describe()
", name);
}public override void on()
public override void off()
}class hp : brand
public override void describe()
", name);
}public override void on()
public override void off()
}
裝置介面類,包含二個方法
inte***ce machine
class pc : machine
public void off()
}class server : machine
public void off()
}class printer : machine
public void off()
}
呼叫**
console.writeline("bradge pattern \n");
brand dell = new dell("dell"); //建立dell品牌
machine dellpc = new pc(); //建立電腦
dell.setmachine(dellpc); //將使用dell電腦
dell.name = "dell d311 pc"; //設定產品名稱
dell.describe();
dell.on();
dell.off();
console.writeline();
brand ibm = new ibm("ibm"); //建立ibm品牌
machine ibmpc = new pc(); //建立電腦
ibm.setmachine(ibmpc); //將使用ibm電腦
ibm.name = "ibm r60e pc"; //設定產品名稱
ibm.describe();
ibm.on();
ibm.off();
machine ibmserver = new server(); //建立伺服器
ibm.setmachine(ibmserver); //將使用ibm伺服器
ibm.name = "ibm x860 server"; //設定產品名稱
ibm.describe();
ibm.on();
ibm.off();
console.writeline();
brand hp = new hp("hp"); //建立hp品牌
machine hppc = new pc(); //建立電腦
hp.setmachine(hppc); //將使用hp電腦
hp.name = "hp h70 pc"; //設定產品名稱
hp.describe();
hp.on();
hp.off();
machine hpprinter = new printer(); //建立印表機
hp.setmachine(hpprinter); //將使用hp印表機
hp.name = "hp laserjet2100 printer";//設定產品名稱
hp.describe();
hp.on();
hp.off();
console.writeline();
**輸出
bradge pattern
****** bradge
i am dell d311 pc
pc power on
pc power off
i am ibm r60e pc
pc power on
pc power off
i am ibm x860 server
server power on
server power off
hp: i am hp h70 pc
pc power on
pc power off
hp: i am hp laserjet2100 printer
printer power on
printer power off
請按任意鍵繼續. . .
設計模式 橋接模式
橋接模式 多維 如車行駛在路上。車分各種品牌 各種型號各種排氣 道路分街道 告訴 山地等 駕駛員分男女 為了減少類的數量。如果按照繼承實現會照成大量冗餘的類,類的數量會相當之大 package com.cn.duduyu.bridgepattern.car public abstract class...
設計模式 橋接模式
橋接模式 用來解決多維度變化問題,一般適用於解決乙個物件有多個屬性同時變化,通過橋接的方式使多種屬性變化解耦,場景 1.畫筆 大小有大中小三種,每種對應5種不同的顏色 這裡的變化屬性為大小 顏色 詳解 抽象類 abstraction 定義抽象類的介面,維護乙個指向implementor型別物件的指標...
設計模式 橋接模式
1 橋接模式感覺就是來解決耦合的,個人的一點理解,參考 大話設計模式 2 具體實現,以手機品牌和手機遊戲為例,手機有很多品牌,而手機有很多個遊戲,即各個手機品牌有很多個子類,手機遊戲有很多個子類,通過建立手機品牌抽象類,定義乙個手機遊戲介面物件,在不同的手機品牌實現類中將手機介面指向具體的實現類來達...