桥梁模式
定义
桥梁模式(Bridge Pattern)也叫做桥接模式。
将抽象和显示解耦,使得两者可以独立地变化。
优缺点、应用场景
优点
- 抽象和实现的解耦。
这是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。 - 优秀的拓展能力
在例子中,如果山寨公司要生产新产品,只需要新建一个产品类,然后通过有参构造传给公司类即可。 - 屏蔽实现细节
高层模型无需关心细节的实现。
应用场景
- 不希望使用继承的场景
- 接口或抽象类不稳定的场景。
- 重用性要求较高的场景。
代码模拟场景
公司都会先生产产品再做销售,有些公司会生产热门山寨产品,赚一波风口钱后就转向生产另一种商品。
非桥梁模式
小结
- 在公司抽象中,生产和销售都单独作为一个方法,即一个类只能实现一种商品的生产与销售。
- 当公司业务线变化后,需要修改公司类自身的代码逻辑,不利于拓展。
UML图
公司抽象和实现
/*** 公司 抽象*/
public abstract class Corp {/*** 生产产品*/protected abstract void produce();/*** 销售产品*/protected abstract void sell();/*** 核心工作——赚钱*/public void makeMoney() {// 先生产,后销售this.produce();this.sell();}
}/*** 房产公司*/
public class RealtyCorp extends Corp {static {System.out.println("=====房地产公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("房地产公司盖房子...");}@Overrideprotected void sell() {System.out.println("房地产公司买房子");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("房地产公司赚大钱");}
}/*** 服装公司*/
public class ClothesCorp extends Corp {static {System.out.println("=====服装公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("服装公司盖房子...");}@Overrideprotected void sell() {System.out.println("服装公司买房子");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("服装公司赚小钱");}
}/*** IPod山寨公司*/
public class IPodCorp extends Corp {static {System.out.println("=====山寨公公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("我生产IPod...");}@Overrideprotected void sell() {System.out.println("我销售IPod嘿嘿嘿...");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("山寨也能赚...");}
}
入口类方法
private static void notBridgePattern() {// 房地产公司赚钱RealtyCorp realtyCorp = new RealtyCorp();realtyCorp.makeMoney();System.out.println();// 服装公司赚钱ClothesCorp clothesCorp = new ClothesCorp();clothesCorp.makeMoney();System.out.println();// 山寨公司赚钱IPodCorp iPodCorp = new IPodCorp();iPodCorp.makeMoney();
}
结果
桥梁模式
小结
- 桥梁模式中,引入产品作为桥梁,公司只需要专注于通过哪种产品赚钱
- 当公司经营的产品发生变化时,只需要修改、添加新的产品类即可
UML图
产品抽象和实现
/*** 产品 抽象*/
public abstract class Product {/*** 产品被生产出*/public abstract void beProduced();/*** 产品被销售*/public abstract void beSell();
}/*** 房子产品*/
public class House extends Product {@Overridepublic void beProduced() {System.out.println("生产房子咯....");}@Overridepublic void beSell() {System.out.println("销售房子咯....");}
}/*** IPod产品*/
public class IPod extends Product {@Overridepublic void beProduced() {System.out.println("生产出山寨IPod...");}@Overridepublic void beSell() {System.out.println("销售山寨IPod...");}
}
公司抽象和实现
/*** 公司 抽象*/
public abstract class Corp {/*** 公司要有自己的产品*/private Product product;public Corp(Product product) {this.product = product;}/*** 核心工作——赚钱*/public void makeMoney() {// 先生产,后销售this.product.beProduced();this.product.beSell();}
}/*** 房产公司*/
public class RealtyCorp extends Corp {static {System.out.println("=====房地产公司是这样运行的=====");}public RealtyCorp(Product product) {super(product);}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("房地产公司赚大钱");}
}/*** IPod山寨公司*/
public class IPodCorp extends Corp {static {System.out.println("=====山寨公公司是这样运行的=====");}public IPodCorp(Product product) {super(product);}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("山寨也能赚...");}
}
入口类方法
private static void bridgePattern() {// 房地产公司赚钱RealtyCorp realtyCorp = new RealtyCorp(new House());realtyCorp.makeMoney();// 山寨公司赚钱IPodCorp iPodCorp = new IPodCorp(new IPod());iPodCorp.makeMoney();
}
结果
参考书籍
秦小波《设计模式之禅》