適配器模式能夠在不改變目標代碼的狀況下,經過引入適配類來給目標類擴展功能。橋接模式也是一種結構型模式。微信
如下沒有更形象生動的介紹,結合平時所寫代碼進行理解爲佳markdown
將抽象和實現解耦,使得二者能夠獨立變化。這裏的抽象和實現能夠理解爲抽象實體和抽象出行爲函數
打個比方,你有一家房地產公司,後面增長了新業務,成立了新的公司,專門快速山寨其它行業爆品性能
//抽象公司 公司共有屬性
public abstract class Corp{
//生產
protected abstract void produce();
//賣產品
protected abstract void sell();
//公司開始運營掙錢
public void run(){
this.produce();
this.sell();
}
}
//你的房地產公司
public class HouseCorp extends Corp(){
protected void produce(){
System.out.println("工人替老闆蓋房子並給工人發工資");
}
protected void sell(){
System.out.println("工人拿到工資後,再借錢向老闆買房子");
}
}
//新開的山寨服裝公司
public class ClothesCorp extends Corp{
protected void produce(){
System.out.println("回收舊衣服,加以利用");
}
protected void sell(){
System.out.println("舊衣服到底賣不賣");
}
}
//場景類
public class Client{
public static void main(String[] args){
HouseCorp houseCrop = new HouseCorp();
houseCorp.run();
ClothesCorp clothesCorp = new ClothesCorp();
clothesCorp.run();
}
}
複製代碼
若是山寨衣服的公司不想生產衣服了,怎麼辦?刪除這個類,而後新建一個具備新產品的類嗎?這樣的代碼改動,也就是新建一個類繼承Corp
,你能夠接受嗎?前期是能夠的,後期若是變化快,那豈不是場景類中須要大量修改代碼。咱們能夠轉變思惟,抽象出產品類,每次你只要指定生產哪一個產品就能夠了,只要符合規範。this
現利用橋接模式改成spa
//抽象產品類
public abstract class Product{
public abstract void beProducted();
public abstract void beSelled();
}
//房子 產品
public class House extends Product{
public void beProducted(){
System.out.println("生產房子");
}
public void beSelled(){
System.out.println("賣房子");
}
}
//山寨衣服 產品
public class Clothes extends Product{
public void beProducted(){
System.out.println("生產衣服");
}
public void beSelled(){
System.out.println("賣衣服");
}
}
//抽象公司
public abstract class Corp{
private Product product;
public Corp(Product product){
this.product = product;
}
public void run(){
//生產產品
this.product.beProducted();
//賣產品
this.product.beSelled();
}
}
//房產公司
public class HouseCorp extends Corp{
public HouseCorp(House house){
super(house);
}
public void run(){
super.run();
}
}
//山寨公司
public class ShanZhaiCorp extend Corp{
public ShanZhaiCorp(Product product){
super(product);
}
public void run(){
super.run();
}
}
//場景類
public class Client{
public static void main(String[] args){
House house = new House();
HouseCorp houseCorp = new HouseCorp(house);
houseCorp.run();
ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes());
shanZhaiCorp.run();
}
}
複製代碼
這裏的構造函數,主要是爲了提醒子類,你必須作這項工做。之後每次山寨產品,擴展,只須要增長公司,繼承Corp
類,增長對應產品類。設計
對應於抽象和實現分離,這裏Product
能夠認爲是實現化,Corp
能夠認爲是抽象化,Product
的子類 與ShanZhaiCorp
已經分離了。山寨公司ShanZhaiCorp
實現類,包含了抽象行爲類Product
以及實現了抽象行爲run
。code
不但願使用繼承的場景orm
接口或抽象類不穩定的場景對象
基於消息驅動的場景。 雖然消息的行爲比較統一,主要包括髮送、接收、處理和回執,但其實具體客戶端的實現一般卻各不相同,好比,手機短信、郵件消息、QQ 消息、微信消息等。
拆分複雜的類對象時。 當一個類中包含大量對象和方法時,既不方便閱讀,也不方便修改。
須要在運行時切換不一樣實現方法時。 好比,經過門面模式調用外部 RPC 服務。
重用性要求高的場景。設計的顆粒度越細,重用的可能性就越大,採用繼承的方式受父類的限制。
抽象和實現分離
優秀的擴充能力
Product
的實現,能夠把變化縮減至最小實現細節對客戶透明
增長了維護成本,用組合和聚合關係不像繼承關係那樣容易找到對象之間的調用關係,稍不注意就會影響到其餘對象
增長了設計難度,橋接模式更重視聚合而非繼承關係,須要創建更多的抽象層
性能降低,組合或者聚合關係,簡化理解的同時,調用對象變多了