前言
这次介绍结构型设计模式中的第二种模式, 桥接模式. 使用桥接模式的目的就是为了解耦, 松散的耦合更利于扩展, 但是会增加相应的代码量和设计难度.
桥接模式
桥接模式是为了将抽象化与实现化解耦, 让二者可以独立地变化. 方便对每一部分的扩展, 以及单独的维护. 抽象化的一方与实现化的一方之间建立一个桥梁, 这样两者的依赖关系就可以通过这个桥梁来建立了.
举例
三个小动物要过河, 分别是小猪, 小鸡, 小马, 小猪要去河对面的空地晒太阳, 小鸡要去河对面的小树林里找虫子吃, 小马要去河对面的草地里吃草. 那么它们三个都要经过小桥才能过河. 有了场景下面来说一下代码的实现, 先创建一个小桥的接口.
- /**
- * 小桥
- */
- public interface Bridge {
- /**
- * 目的地
- */
- void targetLand();
- }
因为三个小动物的目的地不一样, 所以每一个目的地对应一个实现.
小猪的目的地
- /**
- * 空地
- */
- public class VacantLand implements Bridge{
- /**
- * 目的地
- */
- @Override
- public void targetLand() { System.out.println("空旷的地方, 晒太阳");
- }
- }
小鸡的目的地
- /**
- * 小树林
- */
- public class Forest implements Bridge{
- /**
- * 目的地
- */
- @Override
- public void targetLand() {
- System.out.println("小树林, 觅食.");
- }
- }
小马的目的地
- /**
- * 草地
- */
- public class Grassland implements Bridge{
- /**
- * 目的地
- */
- @Override
- public void targetLand() {
- System.out.println("大草原, 尽情奔腾.");
- }
- }
下面来实现抽象化的部分, 每个小动物都要过桥去往不同的目的地, 所以它们都要相同的过桥行为. 所以定义一个动物抽象类.
- /**
- * 小动物
- */
- public abstract class Animal {
- /**
- * 桥
- */
- Bridge bridge;
- /**
- * 过桥
- */
- abstract void willToDo();
- }
小猪
- /**
- * 小猪
- */
- public class Piglet extends Animal {
- /**
- * 过桥
- */
- @Override
- public void willToDo() {
- System.out.println("我是小猪要过桥去");
- }
- }
小鸡
- /**
- * 小鸡
- */
- public class Chick extends Animal {
- /**
- * 过河桥
- */
- @Override
- public void willToDo() {
- System.out.println("我是小鸡要过桥去");
- }
- }
小马
- /**
- * 小马
- */
- public class Pony extends Animal {
- /**
- * 过桥
- */
- @Override
- public void willToDo() {
- System.out.println("我是小马要过桥去");
- }
- }
测试例子
- public class TestBridge {
- public static void main(String[] args) {
- Animal animal = new Chick();
- animal.bridge = new Forest();
- animal.willToDo();
- animal.bridge.targetLand();
- }
- }
运行结果
我是小鸡要过桥去
小树林, 觅食.
这就是一个完整的桥接模式的例子, 这样使得小动物和要去的目的地解耦了. 如果再来了一个小动物, 例如小鸭子, 它只需要继承 Animal 类即可, 如果它的目的地已经存在了就直接使用现有的目的地类, 如果要去的目的地不存在 (例如小鸭子要去池塘), 那么可以再创建一个池塘的目的地, 然后实现自 Bridge 就可以了.
结构
下面来介绍一下桥接模式的结构, 如下图所示.
从上面的结构图中我们可以看出来, 桥接模式其实是分为四个角色的.
抽象化角色 (Animal 类): 定义抽象化, 并保存一个对实现化对象的引用.
抽象化扩展角色 (Chick,Piglet,Pony 等具体的小动物类): 实现和扩展抽象化角色的功能.
实现化角色 (Bridge 接口): 此角色给出了实现化角色的接口, 定义了实现化角色的行为.
具体实现化角色 (VacantLand,GrassLand,Forest 等目的地类): 实现化角色接口的具体实现类.
桥接模式的优缺点
优点
1, 分离抽象和实现部分:
分离了抽象和实现部分, 提高了系统的灵活性, 这样有助于对系统进行分层, 从而产生更好的结构化的系统.
2, 更好的扩展性:
因为抽象部分和实现部分分离开了, 所以这两部分可以独立扩展, 互不影响, 大大提高了系统的可扩展性.
3, 可动态切换:
由于分离了抽象和实现, 那么在实现桥接的时候, 可以实现动态的选择和使用具体的实现, 也就是在运行期间动态切换实现.
4, 减少了子类的数量:
从抽象和实现两个维度来看, 如果不是用桥接模式的话, 这两个维度的子类, 在发生变化时影响到的数量是两个维度子类的乘积. 而使用了桥接模式后影响到的数量是两个维度的子类的和.
缺点
增加了系统的理解和设计难度, 入手并不是那么容易了, 因为聚合关系定义在抽象层, 所以需要开发者对抽象进行设计和编程.
想了解更多的设计模式请查看 Java 设计模式学习记录 - GoF 设计模式概述.
来源: https://www.cnblogs.com/jimoer/p/9310808.html