BridgePattern:通过桥梁链接抽象部分与实现部分,使它们都能独立的变化。好吧,这个设计模式最难理解,抽象部分与实现部分很难理解。
使用场景
- 一个类存在两个独立变化的维度,且这两个维度都需要进行拓展
UML
```java // 抽象部分 public abstract class Abstraction { private Implementro mImpl; public Abstraction(Implementor impl) {
} public abstract void operation() {mImpl = impl;
} }mImpl.operationImpl();
```java// 实现部分的抽象接口public interface Implementor {public void operationImpl();}
// 实现部分的具体实现public class ConcreteImplementorA {@Overridepublic void operationImpl() {}}
Abstraction:抽象部分,持有实现部分引用// 抽象部分的子类public class RefinedAbstraction extends Abstraction {public RefinedAbstraction(Implementor implementor) {super(implementor)}//}
RefinedAbstraction:抽象部分子类
Implementor:实现部分
ConreteImplementorA:实现部分子类Coding
```kotlin
public abstract class Coffee {
// Coffee持有CoffeeAdditives引用
protected CoffeeAdditives impl;
public Coffee(CoffeeAdditives impl) {
this.impl = impl;
}
public abstract void makeCoffee();
}
```kotlinpublic class LargeCoffee extends Coffee {public LargeCoffee(CoffeeAdditives impl) {super(impl);}@Overridepublic void makeCoffee() {System.out.println("大杯的" + impl + "咖啡☕️");}}
public class SmallCoffee extends Coffee {public SmallCoffee(CoffeeAdditives impl) {super(impl);}@Overridepublic void makeCoffee() {System.out.println("小杯的" + impl + "咖啡☕️");}}
public abstract class CoffeeAdditives {public abstract String add();}
public class Suger extends CoffeeAdditives {
@Override
public String add() {
return "加糖";
}
}
public class Oridinary extends CoffeeAdditives {
@Override
public String add() {
return "原味";
}
}
public class BridgePattern {
Oridinary ord = new Oridinary();
Suger sug = new Suger();
// 大杯原味咖啡
LargeCoffee lco = new LargeCoffee(ord);
lcoc.makeCoffee();
// 大杯加糖咖啡
LargeCoffee lcs = new LargeCoffee(sug);
lcs.makeCoffee();
// 小杯原味咖啡
SmallCoffee sco = new SmallCoffee(ord);
soc.makeCoffee();
// 小杯加糖咖啡
SmallCoffee scs = new SmallCoffee(sug);
scs.makeCoffee();
}
Coffe有子类发生了变化,CoffeeAdditives有子类也发生了变化,但都是独立的,这里的桥梁体现在Coffee持有CoffeeAdditives的引用上。谁是抽象部分,谁是实现部分,此刻并不重要了。
