设计模式- 桥接

  1. 意图
  2. 例子
  3. 适用性
  4. 结构
  5. 协作
  6. 效果

意图

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

例子

pubic interface Food {
public void name();
}
public class CatFood implement Food {
public void name() {
System.out.println("猫粮");
}
}
public class DogFood implement Food {
public void name() {
System.out.println("狗粮");
}
}

准备动物

public abstract class Animal {

protected Food food;

public Animal(Food food) {
this.food = food;
}

pubic abstract void eat(Food food);
}

public class Cat extends Animal {

public Cat(Food food) {
super(food);
}

@Override
public void eat() {
System.out.println("mimi-");
food.name();
}
}
public class Dog extends Animal {

public Dog(Food food) {
super(food);
}

@Override
public void eat() {
System.out.println("wowo-");
food.name();
}
}

这个流程代码中写的很清楚了

public class Main {
public static void main(String args[]) {
new Dog(new DogFood()).eat();
new Dog(new CatFood()).eat();
}
}

看着狗在吃猫粮,原则上有点说不通,但是确实可以,只要是粮食。整个设计是将抽象类嵌入一个接口,让他具有使用这个接口的能力。

适用性

  1. 不希望在抽象和他的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  2. 类的抽象以及他的实现都应该可以通过生成子类的方法加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充。
  3. 对一个抽象的实现部分的修改应对客户不产生影响,及客户的代码不必重新编译。
  4. 必须将一个对象分解成两个部分。称这种类层次结构为嵌套的概括
  5. 在多个对象间共享实现(可能是引用计数),但同时要求客户并不知道这一点。

结构

github

协作

Abstraction 将 client 的请求转发给它的 implements 对象。

效果

Bridge 模式有以下一些优点:

�个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。
将 Abstraction 与 Implementor 分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译 Abstraction 类和它的客户程序。为了保证一个类库的不同版本之间的二进制兼容性,一定要有这个性质。
另外,接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需 知道 Abstraction 和 Implementor 即可。

  1. 提高可扩充性
  2. 实现细节对客户透明

��充。

  1. 实现细节对客户透明