桥梁模式
定义
桥梁模式(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("=====房地产公司是这样运行的=====");
}
@Override
protected void produce() {
System.out.println("房地产公司盖房子...");
}
@Override
protected void sell() {
System.out.println("房地产公司买房子");
}
@Override
public void makeMoney() {
super.makeMoney();
System.out.println("房地产公司赚大钱");
}
}
/**
* 服装公司
*/
public class ClothesCorp extends Corp {
static {
System.out.println("=====服装公司是这样运行的=====");
}
@Override
protected void produce() {
System.out.println("服装公司盖房子...");
}
@Override
protected void sell() {
System.out.println("服装公司买房子");
}
@Override
public void makeMoney() {
super.makeMoney();
System.out.println("服装公司赚小钱");
}
}
/**
* IPod山寨公司
*/
public class IPodCorp extends Corp {
static {
System.out.println("=====山寨公公司是这样运行的=====");
}
@Override
protected void produce() {
System.out.println("我生产IPod...");
}
@Override
protected void sell() {
System.out.println("我销售IPod嘿嘿嘿...");
}
@Override
public 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 {
@Override
public void beProduced() {
System.out.println("生产房子咯....");
}
@Override
public void beSell() {
System.out.println("销售房子咯....");
}
}
/**
* IPod产品
*/
public class IPod extends Product {
@Override
public void beProduced() {
System.out.println("生产出山寨IPod...");
}
@Override
public 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);
}
@Override
public void makeMoney() {
super.makeMoney();
System.out.println("房地产公司赚大钱");
}
}
/**
* IPod山寨公司
*/
public class IPodCorp extends Corp {
static {
System.out.println("=====山寨公公司是这样运行的=====");
}
public IPodCorp(Product product) {
super(product);
}
@Override
public 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();
}
结果
参考书籍
秦小波《设计模式之禅》