java桥接模式_Java 设计模式之桥接模式(七)

一、前言

本篇主题为结构型模式中的第二个模式--桥接模式。上篇 Java 设计模式主题为《Java 设计模式之适配器模式(六)》。

二、简单介绍

# 2.1 定义

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

# 2.2 应用场景

处理多层继承结构,多维度变化的场景。将各个维度设计成独立的继承结构,使得各个维度可以独立的扩展。

三、实现方式

我们以电脑为例,在网上商城中,我们可以看到电脑的分类菜单,分类结构如下图所示:

7019b7749567ed74953fe808b522791d.png

图中将电脑结构分成 3 级,第 1 级就是商品名称(电脑),第 2 级是电脑类型分类,第 3 级是品牌分类。现在,我们试着通过代码实现上图的结构:

public interface Computer {

void info();

}

class Desktop implements Computer {

@Override

public void info() {

System.out.println("台式电脑!");

}

}

class Laptop implements Computer {

@Override

public void info() {

System.out.println("笔记本电脑!");

}

}

class LenovoDesktop extends Desktop {

@Override

public void info() {

System.out.println("联想台式电脑");

}

}

class AsusDesktop extends Desktop {

@Override

public void info() {

System.out.println("华硕台式电脑");

}

}

class LenovoLaptop extends Laptop {

@Override

public void info() {

System.out.println("联想笔记本电脑");

}

}

class AsusLaptop extends Laptop {

@Override

public void info() {

System.out.println("华硕笔记本电脑");

}

}

复制代码

上述代码通过继承方式实现了图中的电脑分类结构。但是,使用继承的方式存在几个问题:

扩展性问题:如果新增平板电脑分类,需要添加 N 个品牌子类。如果新增索尼品牌,其他电脑分类也需要添加相应子类。

违背单一职责原则:新增类型或新增品牌都会导致第 3 级目录结构的变化。

下面,我们使用桥接模式解决上述问题:

我们从 2 个维度分类,将它们分离独立出来,即将电脑类型和电脑品牌分离出来。

品牌维度:

public interface Brand {

void info();

}

class LenovoBrand implements Brand {

@Override

public void info() {

System.out.println("联想");

}

}

class AsusBrand implements Brand {

@Override

public void info() {

System.out.println("华硕");

}

}

复制代码

类型维度:

public abstract class Computer {

protected Brand brand;

public Computer(Brand brand) {

this.brand = brand;

}

public void info() {

this.brand.info();

}

}

class Desktop extends Computer {

public Desktop(Brand brand) {

super(brand);

}

public void info() {

super.info();

System.out.println("台式电脑");

}

}

class Laptop extends Computer {

public Laptop(Brand brand) {

super(brand);

}

public void info() {

super.info();

System.out.println("笔记本电脑");

}

}

复制代码

客户端:

public class Client {

public static void main(String[] args) {

Computer computer = new Desktop(new LenovoBrand());

computer.info();

}

}

复制代码

结果打印:

联想

台式电脑

复制代码

当我们在其中一个维度上的代码进行修改时并不是影响到另一个维度的代码,这样遵循了单一职责原则,同时代码结构也变得灵活起来。

UML 类图表示如下:

303e0c52a90596c36f99c6041333c4cf.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值