桥接模式
Demo地址
https://github.com/rocky123shine/Bridge
定义
桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。
它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
桥接模式角色
- 抽象部分(抽象,接口)
- 优化抽象部分
- 实现部分抽象(抽象,接口)
- 实现部分具体实现
桥接模式的使用场景
- 开发中类的层次机构复杂
- 不同API间的桥接
- 一个类中存在两个独立的维度,且不同的维度都要扩展
桥接模式的简单设计和实现
模拟场景:客人去店买咖啡,咖啡有大中小杯,咖啡中可加东西和不加东西
首先分析角色:
该场景中有两个对象,咖啡和冰,关系是咖啡可以加入冰
那么我们按照桥接模式的角色,把角色归类:
咖啡为抽象角色,大中小杯为抽象部分的优化(实现部分)
冰为实现部分的抽象角色,加冰不加冰为实现部分抽象的具体实现
由于抽象类Coffee中持有实现部分抽象的对象那么就有实现部分抽象角色的接口
//添加物抽象
public interface AddIce {
//添加的一些的逻辑或者动作的处理
String doSth();
}
有实现部分抽象对象后那么就有:抽象类Coffee
public abstract class Coffee {
//Coffee 可以添加东西 这里我们持有添加物 的对象
private AddIce addIce;
public Coffee(AddIce additive){
this.addIce = additive;
}
public AddIce getAdditive() {
return addIce;
}
//做和咖啡相关的动作
public abstract void drinkCoffee();
}
实现抽象的优化 大中小杯的实现(只写出一个,其他类似)
public class BigCoffee extends Coffee {
public BigCoffee(AddIce additive) {
super(additive);
}
@Override
public void drinkCoffee() {
Log.i("main", "大杯" + getAdditive().doSth() + "咖啡");
}
}
实现部分抽象的具体实现(写一个)
public class Ice implements AddIce {
@Override
public String doSth() {
return "记得加冰哦";
}
}
最后我们测试一下,查看打印log
BigCoffee coffee = new BigCoffee(new NoIce());
coffee.drinkCoffee();
log结果为:大杯记得不加冰哦咖啡
这是如果我们给咖啡扩展功能,那么不会影响是否添加东西,同样,添加东西的扩展不会影响到咖啡,这样就实现了同一类的不同纬度的互不干扰