橋樑模式:將抽象和實現解耦,使二者能夠獨立的變化。解釋:將兩個有組合關係,強耦合的對象,各自抽象而後解耦。(類關係圖看https://www.cnblogs.com/blogxiao/p/9513883.html 這篇文章)html
下面以公司生產產品爲例子。java
1.小汽車公司生產小汽車。這裏有兩個對象:汽車公司和小汽車。這兩個是聚合的關係。類關係圖以下:ide
業務邏輯就是:汽車公司生產汽車產品this
2.缺點:擴展性差,當有是個產品須要生產的時候,此時須要在往這裏面的增長十個產品類。當有多個公司生產多個產品的時候,此時公司和類都會有多份。橋樑模式解決:公司能夠有多個,產品能夠有多個。每一個公司均可以生產任意產品。idea
將公司和產品抽象,當客戶端想怎麼隨機組合均可以。spa
3.具體的類實現經過idea 生成:code
注意1 和 2 的地方和上面的畫的不同,能夠限定最小類型也能夠限定父親Producthtm
4.代碼對象
Product.javablog
package javadesign.bridge; public abstract class Product { public abstract void beProducted(); public abstract void beSelled(); }
Company.java
package javadesign.bridge; public abstract class Company { Product product; public Company(Product product){ this.product=product; } public void makeMoney(){ this.product.beProducted(); this.product.beSelled(); } }
Product 的子類:CarProduct.java
package javadesign.bridge.subpro; import javadesign.bridge.Product; public class CarPro extends Product { @Override public void beProducted() { System.out.println("生產汽車"); } @Override public void beSelled() { System.out.println("賣汽車"); } }
Product 的子類:ToysProduct.java
package javadesign.bridge.subpro; import javadesign.bridge.Product; public class ToysPro extends Product { @Override public void beProducted() { System.out.println("生產玩具"); } @Override public void beSelled() { System.out.println("賣玩具"); } }
Company 的子類:carCompany
package javadesign.bridge.subcop; import javadesign.bridge.Company; import javadesign.bridge.subpro.CarPro; public class CarCompany extends Company { public CarCompany(CarPro product) { super(product); } @Override public void makeMoney() { super.makeMoney(); System.out.println("公司賣車掙錢"); } }
Company 的子類:ToysCompany
package javadesign.bridge.subcop; import javadesign.bridge.Company; import javadesign.bridge.subpro.ToysPro; public class ToysCompany extends Company { public ToysCompany(ToysPro product) { super(product); } @Override public void makeMoney() { super.makeMoney(); System.out.println("公司掙賣玩具的錢"); } }
client.java
package javadesign.bridge; import javadesign.bridge.subcop.CarCompany; import javadesign.bridge.subcop.ToysCompany; import javadesign.bridge.subpro.CarPro; import javadesign.bridge.subpro.ToysPro; public class Client { public static void main(String[] args) { CarPro carPro=new CarPro(); Company company=new CarCompany(carPro); company.makeMoney(); System.out.println("======================="); ToysPro toysPro=new ToysPro(); Company company1=new ToysCompany(toysPro); company1.makeMoney(); } }
運行結果:
5.通用的橋樑模式:
橋樑模式的優勢:解決不能多繼承的缺點,在該模式下實現不受抽象的約束。
應用場景:發現類的繼承有N層的時候使用。