07.(结构型模式)java设计模式之桥接模式

一、什么是桥接模式模式

桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”

应用场景

  • 系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性
  • 不想使用继承导致系统类的个数急剧增加的系统
  • 有时候一个类,可能会拥有多个变化维度,比如啤酒,有不同的容量和品牌,可以使用继承组合的方式进行开发,假如维度很多,就容易出现类的膨胀,使用桥接模式就可以解决这个问题,且解耦

二、桥接模式的实现方式

模式结构分析:

 桥接模式所涉及的角色有:

  ●  抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。

  ●  修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。

  ●  实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

  ●  具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。

案例中类关系图:

统一模型:

代码实现:

查看代码
public abstract class Phone {
    /**
     * 通过组合的⽅式来桥接其他⾏为
     */
    protected Color color;
    public void setColor(Color color) {
        this.color = color;
    }
    /**
     * ⼿机的⽅法
     */
    abstract public void run();
}
//颜色维度
public interface Color {
    void userColor();
}
/*
* 具体的手机(iphone)
* */
public class IPhone extends Phone {
    public IPhone(Color color){
        super.setColor(color);
    }
    @Override
    public void run() {
       color.userColor();
        System.out.println("苹果⼿机");
    }
}
/*
*具体的手机(huawei)
* */
public class HWPhone extends Phone {

    public HWPhone(Color color){
        super.setColor(color);
    }
    @Override
    public void run() {
        color.userColor();
        System.out.println("华为⼿机");
    }
}/*
* 具体的颜色(红色)
* */
public class RedColor implements Color{
    @Override
    public void userColor() {
        System.out.println("红色");
    }
}
/*
 * 具体的颜色(黄色)
 * */
public class YellowColor implements Color {
    @Override
    public void userColor() {
        System.out.println("黄色");
    }
}
/*
 * 具体的颜色(蓝色)
 * */
public class BlueColor implements Color {
    @Override
    public void userColor() {
        System.out.println("蓝⾊");
    }
}

测试用例:

/*
* 桥接模式
* */
@Test
public void brigeDesign(){
    HWPhone blueHwPhone = new HWPhone(new BlueColor());
    blueHwPhone.run();
    HWPhone redHwPhone = new HWPhone(new RedColor());
    redHwPhone.run();
    IPhone applePhone = new IPhone(new RedColor());
    applePhone.run();
}

测试结果:

蓝⾊
华为⼿机
红色
华为⼿机
红色
苹果⼿机

方法评估:

按GOF的说法,桥接模式和适配器模式用于设计的不同阶段

  • 桥接模式用于设计的前期,精细化的设计,让系统更加灵活。
  • 适配器模式用于设计完成之后,发现类、接口之间无法一起工作,需要进行填坑。

适配器模式经常用在第三方API协同工作的场合,在功能集成需求越来越多的今天,这种模式的使用频度越来越高,包括有些同学听过外观设计模式,这个也是某些场景和适配器模式一样

优点:

  • 抽象和实现的分离。
  • 优秀的扩展能力,符合开闭原则缺点。

缺点:

  • 增加系统的理解与设计难度。
  • 使用聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,比如抽象类汽车,里面聚合了颜色类,有点像对象适配器。
posted @ 2023-01-08 15:20  冰融心  阅读(30)  评论(0编辑  收藏  举报