设计模式之桥接设计模式

概述

基本介绍
1、桥接模式(Bridge Pattern)是指:将现实和抽象放在两个不同的类层次中,使这两个层次可以独立改变;
2、桥接模式是一种结构型设计模式
3、Bridge 设计模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

桥接模式原理类图

在这里插入图片描述
说明:
1、Client类:桥接模式的调用者;
2、抽象类(Abstraction) :维护了Implementor /即它的实现类ConcreteImplementorA…,二者是聚合关系, Abstraction充当桥接类;
3、RedefinedAbstraction:是Abstraction抽象类的子类;
4、Implementor:行为实现类的接口;
5、ConcreteImplementorA/B:行为的具体实现类。

从UML类图中可以看出,这里的抽象类和接口是聚合的关系,也就是调用和被调用的关系。

桥接模式优缺点

优点:
1、抽象和实现的分离
2、优秀的扩展能力
3、实现细节对客户透明

缺点:
1、增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
2、要求正确识别出系统中两个独立变化的纬度,因此其使用范围有一定的局限性

案例

家电电器有很多种,也有很多品牌,电器和品牌存在关系

在这里插入图片描述如图所示,如果按照这样的设计,每增加一种电器就需要对应的绑定品牌;另一种情况是,每增加一个品牌就需要在对应的电器下添加。这样的话会导致出现许多重复性的代码,而且耦合度也很高。

如果添加新的品牌或者新的电器而不会改动先有的类,该怎么设计呢?

根据桥接模式,代码可以设计成下图的流程

在这里插入图片描述
ElectricAppliance接口:

/**
 * 家用电器接口
 */
public interface ElectricAppliance {

    String description();
}

AirConditioner类、WashingMachine类、WaterHeater类:

/**
 * 空调
 */
public class AirConditioner implements ElectricAppliance{

    private final String name = "空调";

    @Override
    public String description() {
        return name;
    }
}

/**
 * 洗衣机
 */
public class WashingMachine implements ElectricAppliance {

    private final String name = "洗衣机";

    @Override
    public String description() {
        return name;
    }
}

/**
 * 热水器
 */
public class WaterHeater implements ElectricAppliance{

    private final String name = "热水器";

    @Override
    public String description() {
        return name;
    }
}

Brand抽象类:

/**
 * 抽象类:品牌类
 */
public abstract class Brand {

    protected ElectricAppliance electricAppliance;

    public Brand(ElectricAppliance electricAppliance) {
        this.electricAppliance = electricAppliance;
    }

    abstract String description();
}

Gree类、Haier类、Midea类:

/**
 * 格力
 */
public class Gree extends Brand{

    private final  String name = "格力";

    public Gree(ElectricAppliance electricAppliance){
        super(electricAppliance);
    }

    @Override
    String description() {
        return name +"品牌的"+ electricAppliance.description();
    }
}

/**
 * 海尔
 */
public class Haier extends Brand{

    private final  String name = "海尔";

    public Haier(ElectricAppliance electricAppliance) {
        super(electricAppliance);
    }

    @Override
    String description() {
        return name + "品牌的"+electricAppliance.description();
    }
}

public class Midea extends Brand{

    private final  String name = "美的";

    public Midea(ElectricAppliance electricAppliance) {
        super(electricAppliance);
    }

    @Override
    String description() {
        return name + electricAppliance.description();
    }
}

Test:测试类

public class BridgeTest {

    public static void main(String[] args) {
        Brand midea = new Midea(new WashingMachine());
        System.out.println(midea.description());

        Brand gree1 = new Gree(new WashingMachine());
        System.out.println(gree1.description());

        // 添加新电器
        Brand gree2 = new Gree(new AirConditioner());
        System.out.println(gree2.description());

        // 添加新品牌
        Brand haier1 = new Haier(new WashingMachine());
        System.out.println(haier1.description());
        Brand haier2 = new Haier(new WaterHeater());
        System.out.println(haier2.description());
    }
}

运行结果

美的洗衣机
格力品牌的洗衣机
格力品牌的空调
海尔品牌的洗衣机
海尔品牌的热水器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值