介绍
桥接模式属于结构型模式,用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。桥接模式适用于一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,以及不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,或者一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
就例如各个小吃店的点餐系统,商品名称会和微辣、中辣、特辣区分开。小吃店的菜单可以看下图
通常这种都会放在另外一块,而不是放在每个食物的前面。如果放在食物的前面,那么这个菜单的扩大3倍,
如果商家又推出变态辣,那么整个菜单就需要重新做。
结构图
案例
这篇就用小吃店的点餐系统来举例。
食物抽象类
public abstract class Food {
protected Seasoning seasoning;
public void setSeasoning(Seasoning seasoning) {
this.seasoning = seasoning;
}
public abstract void addSeasoning();
}
食物继承类-茄子
public class Eggplant extends Food {
@Override
public void addSeasoning() {
System.out.print("茄子");
seasoning.addSeasoning();
}
}
食物继承类-鱼
public class Fish extends Food {
@Override
public void addSeasoning() {
System.out.print("鱼");
seasoning.addSeasoning();
}
}
调料实现类接口
public interface Seasoning {
void addSeasoning();
}
芥末调料
public class Mustard implements Seasoning {
@Override
public void addSeasoning() {
System.out.println("加芥末");
}
}
香菜调料
public class Coriander implements Seasoning {
@Override
public void addSeasoning() {
System.out.println("加香菜");
}
}
测试类
public class Client {
public static void main(String[] args) {
Food fish = new Fish();
fish.setSeasoning(new Coriander());
fish.addSeasoning();
Food eggplant = new Eggplant();
eggplant.setSeasoning(new Mustard());
eggplant.addSeasoning();
}
}
如果要增加调料或者增加食物,只要继承相应的类或者接口就可以了。
Github地址
总结
--
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
使用桥接模式可以分离抽象接口及其实现部分,提高了系统的可扩充性实现细节对客户透明,可以对用户隐藏实现细节;其主要缺点是增加系统的理解与设计难度,且识别出系统中两个独立变化的维度并不是一件容易的事情。