Bridge 桥梁模式 桥接模式

时间:2023-03-09 09:08:35
Bridge 桥梁模式 桥接模式

简介
将【抽象部分】(Abstraction,人)与【实现部分】(Implementor,人穿的衣服)分离,使它们都可以独立的变化。
【业务抽象角色】引用【业务实现角色】,或者说【业务抽象角色】的部分实现是由【业务实现角色】完成的

Bridge模式基于【类的最小设计原则】,通过使用封装,聚合以及继承等行为来【让不同的类承担不同的责任】。它的主要特点是把【抽象】与【行为实现】分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

可以这么理解,【抽象】是一个事物的本身的特征,【行为】是一个事物可以做的动作,特征是相对独享的,行为是可以共享的。

作用:解耦。

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

作用:将抽象部分与其实现部分分离,使它们都可以独立地变化
JDK中体现:java.util.logging中的Handler和Formatter
AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)
JDBC

演示
抽象部分,Abstraction,业务抽象角色(人)是一个事物的本身的特征,
public abstract class Person {
    public Clothing clothing;
    public String type;
    public abstract void dress();
}
class Man extends Person {
    public Man() {
        this.type = "男人";
    }
    @Override
    public void dress() {
        if (clothing != null) clothing.personDressCloth(this);
    }
}
class Lady extends Person {
    public Lady() {
        this.type = "女人";
    }
    @Override
    public void dress() {
        if (clothing != null) clothing.personDressCloth(this);
    }
}

实现部分,Implementor,业务实现角色(穿衣服)是一个事物(人)可以做的动作,在程序运行时刻,实现部分可以选择或者切换
public abstract class Clothing {
    public abstract void personDressCloth(Person person);//人穿衣服
}
class Trouser extends Clothing {
    @Override
    public void personDressCloth(Person person) {
        if (person != null) System.out.println(person.type + "穿裤子");
    }
}
class Jacket extends Clothing {
    @Override
    public void personDressCloth(Person person) {
        if (person != null) System.out.println(person.type + "穿马甲");
    }
}


public class Test {
    public static void main(String[] args) {
        Person man = new Man();
        Person lady = new Lady();
        Clothing jacket = new Jacket();
        Clothing trouser = new Trouser();

        jacket.personDressCloth(man);
        trouser.personDressCloth(man);
        System.out.println("\n");
        jacket.personDressCloth(lady);
        trouser.personDressCloth(lady);
    }
}

附件列表