橋樑模式:其實就是把抽象和實現解耦,解決了繼承的缺點,實現能夠不用受抽象的約束,不用再綁定在一個固定的抽象層次上。java
公司產品橋樑模式案例ide
若是使用普通的繼承,那動態具備好多種公司,房地產、服裝公司、餐飲公司,然而房地產公司又能夠分爲 公寓房公司、別墅房公司等等...這樣的話,子類就太多啦,擴展也不是很方便。this
若是使用橋樑模式,把公司和產品解耦,每種類型的公司能夠與任意的產品組合。且產品不用受公司抽象類的約束,擴展方便spa
具體的代碼以下:code
Product.java 實現角色代碼以下blog
package com.designModel.Bridgemodel; /** * 實現角色 的抽象類 */ public abstract class Product { //生產 public abstract void product(); //銷售 public abstract void sell(); }
Copr.java 抽象角色繼承
package com.designModel.Bridgemodel; /** * 抽象角色 */ public abstract class Copr { //實現角色 private Product product; public Copr(Product product) { this.product = product; } //公司的目的就是賺錢 public void makeMoney() { this.product.product(); this.product.sell(); } }
具體的抽象角色接口
HouseCopr.java get
package com.designModel.Bridgemodel; public class HouseCopr extends Copr { public HouseCopr(Product product) { super(product); } @Override public void makeMoney() { super.makeMoney(); System.out.println("房地產公司賺大錢"); } }
ShanZhaiCopr.java產品
package com.designModel.Bridgemodel; public class ShanZhaiCopr extends Copr { public ShanZhaiCopr(Product product) { super(product); } @Override public void makeMoney() { super.makeMoney(); System.out.println("山寨公司賺錢"); } }
具體的實現角色
Clothes.java
package com.designModel.Bridgemodel; public class Clothes extends Product { @Override public void product() { System.out.println("生成衣服"); } @Override public void sell() { System.out.println("銷售衣服"); } }
Ipod.java
package com.designModel.Bridgemodel; public class Ipod extends Product { @Override public void product() { System.out.println("生產Ipod產品"); } @Override public void sell() { System.out.println("銷售Ipod產品"); } }
Client.java調用類
package com.designModel.Bridgemodel;
public class Client {
public static void main(String... args) {
HouseCopr houseCopr = new HouseCopr(new Clothes());
houseCopr.makeMoney();
System.out.println("--------------------");
ShanZhaiCopr shanZhaiCopr = new ShanZhaiCopr(new Ipod());
shanZhaiCopr.makeMoney();
System.out.println("------------------");
ShanZhaiCopr shanZhaiCopr1 = new ShanZhaiCopr(new Clothes());
shanZhaiCopr1.makeMoney();
}
}
橋樑模式關係類圖以下
Abstraction---------------抽象化角色
它的主要指責是定義出該角色的行爲,同時保存一個對實現化角色的引用,該角色通常是抽象類
Implementor---------------實現化角色
它是接口或抽象類,定義角色必需的行爲和屬性
RefinedAbstraction--------------修正抽象化角色
它引用實現化角色對抽象化角色進行修正
ConcreteImplementor---------具體實現化角色
它實現接口或抽象類定義的方法和屬性
Implementor.java
package com.designModel.Bridgemodel; public interface Implementor { void doSomething(); void doAnything(); }
ConcreteImplementor1.java
package com.designModel.Bridgemodel; public class ConcreteImplementor1 implements Implementor { @Override public void doSomething() { } @Override public void doAnything() { } }
Abstraction.java
package com.designModel.Bridgemodel; public abstract class Abstraction { private Implementor implementor; public Abstraction(Implementor _impl) { this.implementor = _impl; } public void request() { this.implementor.doSomething(); } public Implementor getImp() { return implementor; } }
具體抽象化角色
package com.designModel.Bridgemodel; public class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor _impl) { super(_impl); } //修正父類的行爲 @Override public void request() { super.request(); super.getImp().doAnything(); } }