本文主要是看了《设计模式》做的笔记和思考,在此分享仅代表个人观点,如有不对的地方欢迎批评和指正。
Bridge(桥接)模式
基础
该模式着重解决的问题,是将整体中某个可能多变的部分抽象并分离,使得需求改变时仅需改变抽象部分即可,改变后,使用方式不变。
Adapter模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。 ——《设计模式》
借博客园一博主的图片一用:
title重点介绍下这些组件:
- Client:使用者
- Abstraction:抽象类(其实可以直接是实体类),并且使用Implementor进行更高级的操作
- Implement:定义接口,里面是基础的操作
- ConcreteImplement:实现Implement中的接口
例子
拿钢铁侠的反应炉举例吧,钢铁侠和他胸口的反应炉的关系应该如下:
public class IronMan {
private ArcReactor reactor;
private double health = 100; //假设其为100,降到0就中毒
public void setReactor(ArcReactor reactor) {
this.reactor = reactor;
}
public void use() {
double energy = reactor.getEnergy();
// do something
System.out.println("使用钢铁侠套装");
health = reactor.solveScrap(health);
}
public double checkPd() {
String s = "当前血液中钯浓度为"+(100-health)+"%,";
String result = "";
if(health < 0) {
result = "已中毒过深";
}else if (health == 100) {
result = "健康";
}else {
result = "请尽快处理";
}
System.out.println(s+result);
return health;
}
public void reset() {
health = 100;
}
}
public interface ArcReactor {
public double getEnergy();
// 处理废料
public double solveScrap(double body);
}
然后Tony创造了两种:微型方舟反应炉,新元素方舟反应炉。
/**
* 微型化的方舟反应炉
* @author Will
*/
public class MicroReactor implements ArcReactor {
private double palladium = 100; //钯元素
private double scrap = 0;
@Override
public double getEnergy() {
palladium--;
return 30;
}
@Override
public double solveScrap(double body) {
// 废料直接排出
scrap++;
body-=11;
return body;
}
}
public class NewElementReactor implements ArcReactor {
private double newElement = 100; //新元素
@Override
public double getEnergy() {
newElement--;
return 30;
}
@Override
public double solveScrap(double body) {
// 清洁能源无污染
return body;
}
}
使用如下:
public class Main {
public static void main(String[] args) {
IronMan tony = new IronMan();
MicroReactor oldReactor = new MicroReactor();
tony.setReactor(oldReactor);
tony.use();
tony.checkPd();
tony.reset();
System.out.println("\n换个反应炉再来\n");
NewElementReactor newReactor = new NewElementReactor();
tony.setReactor(newReactor);
tony.use();
tony.checkPd();
}
}
结果如下:
使用钢铁侠套装
当前血液中钯浓度为11.0%,请尽快处理
换个反应炉再来
使用钢铁侠套装
当前血液中钯浓度为0.0%,健康
更换反应炉并不影响整个使用过程,而且,IronMan这个类的子类可以继续使用。
总结
Bridge模式重点在于将容易变更的部分抽象出来,抽象部分的改动不影响整体的其他代码,而且整体的子类能以相同的方式使用抽象部分,让代码更加灵活。
网友评论