设计模式之桥接模式

余生长醉 提交于 2020-03-06 00:10:24

定义: 将抽象与实现解耦,使得俩者可以独立的变化。这种模式将抽象部分与实现部分联系起来,就像是一座桥,将桥的两岸连接,构成一个整体。桥接模式是一种行为型设计模式。
桥接模式的4个模型角色:

  • 抽象化角色模型: 抽象角色,持有实现化角色引用;
  • 具体抽象化模型: 继承至抽象化角色,实现抽象化角色定义的方法逻辑并扩展自己本身的特性;
  • 实现化角色模型: 通常声明为接口,提供对应的逻辑方法;
  • 具体实现化角色模型: 对实现化角色中的逻辑方法提供具体的实现;

使用桥接模式实现一个简单案例。
场景:花园有很多不同种类,不同颜色的花,现在要了解花的颜色与种类。
分析:对于最顶层花的描述肯定是要抽象的,具体什么花通过继承可以实现,那么颜色这个描述就是实现化模型了。
代码示例:

//抽象化模型  - 花
public abstract class Flower {
    private Color color;

    public Flower(Color color) {
        this.color = color;
    }

    public abstract String getFlower();

     /**
     * 声明一个公共部分的方法
     * @return
     */
    public void show() {
        Log.d("TAG", "一朵" + color.getColor() + "的" + getFlower());
    }
}
//实现化模型 -- 颜色
public interface Color {

    String getColor();
}

具体化实现类(具体的颜色类型,例举2个)

public class Red implements Color {

    @Override
    public String getColor() {
        return "红色";
    }
}

public class White implements Color {
    @Override
    public String getColor() {
        return "白色";
    }
}

具体抽象化模型(具体的花类型,也是列举2个)

public class ChineseRose extends Flower {

    public ChineseRose(Color color) {
        super(color);
    }

    @Override
    public String getFlower() {
        return "月季";
    }
}

public class Rose extends Flower {

    public Rose(Color color) {
        super(color);
    }

    @Override
    public String getFlower() {
        return "玫瑰";
    }
}

以上四种模型均已完成,实际使用:

        //红、白色的玫瑰
        Rose rose1 = new Rose(new Red());
        Rose rose2 = new Rose(new White());
        rose1.show();
        rose2.show();
        //红、白色的月季
        ChineseRose cRose1 = new ChineseRose(new Red());
        ChineseRose cRose2 = new ChineseRose(new White());
        cRose1.show();
        cRose2.show();

应用场景:

  • 如果设计上需要使得抽象角色与具体角色之间增加更多的灵活性,减少之前的联系,可以使用这种模式;
  • 会因为多重继承关系导致系统类的个数急剧增加时,可以使用桥接模式;
  • 一个类会有多种可以独立变化的维度(或属性方法,如例子上面的颜色,品种);

优点:

  • 抽象与实现分离,使得它们可以独立变化提高灵活性,扩展能力强;
  • 降低耦合;
  • 有助于对面向对象的设计原则的理解,形成正确的设计思想,培养良好的设计风格;
    小结
    例子写的很简单,只是一个样本,不能够直观反映出桥接模式的特点。考虑到多维度情况,继承已经无法满足 需求了,就必须要使用到接口实现。抽象角色实现接口会使继承与实现关系太强,牵一发而动全身,影响其子类; 具体化实例实现这个接口,部分代码耦合度太高,代码累赘,复用性差,意义不大。桥接模式在抽象内部持有实现角色的实例将两者联系起来, 实现抽象与实现分离,两者互补影响,灵活度高。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!