为什么需要桥接(Bridge)模式

  商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?

  采用多层继承结构:

多层继承结构代码示例

Computer.java

package com.cnki.bridge;

public interface Computer {
void sale();
} class Desktop implements Computer {
@Override
public void sale() {
System.out.println("销售台式机!");
}
} class Laptop implements Computer {
@Override
public void sale() {
System.out.println("销售笔记本!");
}
}
class Pad implements Computer {
@Override
public void sale() {
System.out.println("销售平板电脑!");
}
} class LenovoDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售联想台式机");
}
}
class LenovoLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售联想笔记本");
}
}
class LenovoPad extends Pad {
@Override
public void sale() {
System.out.println("销售联想平板电脑");
}
} class ShenzhouDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售神舟台式机");
}
}
class ShenzhouLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售神舟笔记本");
}
}
class ShenzhouPad extends Pad {
@Override
public void sale() {
System.out.println("销售神舟平板电脑");
}
} class DellDesktop extends Desktop {
@Override
public void sale() {
System.out.println("销售戴尔台式机");
}
}
class DellLaptop extends Laptop {
@Override
public void sale() {
System.out.println("销售戴尔笔记本");
}
}
class DellPad extends Pad {
@Override
public void sale() {
System.out.println("销售戴尔平板电脑");
}
}

采用多层继承结构带来的问题

  这个场景中有两个变化的维度:电脑类型、电脑品牌

  使用桥接模式,连接“电脑类型”和“电脑品牌”。

问题:

  扩展问题(类个数膨胀问题)

  如果增加一个新的电脑类型,则要增加各个品牌下面的类。

  如果增加一个新的品牌,也要增加各种电脑类型面的类。

  违反单一职责原则:

  一个类:联想笔记本,有两个引起这个类变化的原因。(联想是品牌,笔记本是类型,品牌类型没有分开!)

桥接模式总结

  桥接模式可以取代多层继承的方案。 多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。

  桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。

桥接模式实际开发中应用场景

  JDBC驱动程序

  AWT中的Peer架构

  银行日志管理:

  格式分类:操作日志、交易日志、异常日志

   距离分类:本地记录日志、异地记录日志

  人力资源系统中的奖金计算模块:

  奖金分类:个人奖金、团体奖金、激励奖金。

   部门分类:人事部门、销售部门、研发部门。

  OA系统中的消息处理:

  业务类型:普通消息、加急消息、特急消息

  发送消息方式:系统内消息、手机短信、邮件

桥接模式代码示例

Brand.java

package com.cnki.bridge;

/**
* 电脑类型的维度
* @author Administrator
*
*/
public class Computer2 { protected Brand brand;//品牌 public Computer2(Brand b) {
this.brand = b;
} public void sale(){
brand.sale();
} } class Desktop2 extends Computer2 { public Desktop2(Brand b) {
super(b);
} @Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
} class Laptop2 extends Computer2 { public Laptop2(Brand b) {
super(b);
} @Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}

Computer2.java

package com.cnki.bridge;

/**
* 电脑类型的维度
* @author Administrator
*
*/
public class Computer2 { protected Brand brand;//品牌 public Computer2(Brand b) {
this.brand = b;
} public void sale(){
brand.sale();
} } class Desktop2 extends Computer2 { public Desktop2(Brand b) {
super(b);
} @Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
} class Laptop2 extends Computer2 { public Laptop2(Brand b) {
super(b);
} @Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}

测试

package com.cnki.bridge;

public class Client {
public static void main(String[] args) {
//销售联想的笔记本电脑
Computer2 c = new Laptop2(new Lenovo());
c.sale(); //销售神舟的台式机
Computer2 c2 = new Desktop2(new Shenzhou());
c2.sale(); }
}

小结

  桥接模式可以取代多重继承

  有多个变化维度可以使用桥接模式

② 设计模式的艺术-08.桥接(Bridge)模式的更多相关文章

  1. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  2. 设计模式初探-桥接(Bridge)模式

    桥接(Bridge)模式,又称Handle/Body模式,属于对象结构型模式.用于将抽象部分与它的实现部分分离,使它们都可以独立地变化.比如常见的电脑窗口界面,不同的操作系统其窗口界面绘制的原理肯定不 ...

  3. Java 实现桥接(Bridge)模式

    类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  4. 设计模式之Birdge(桥接)模式

    1.出现原因 1.同一个类型,有两个变化的维度(两个维度的抽象:一个抽象部分的抽象,一个实现部分的抽象) 2.如何应对这种“多维度的变化”?如何利用面向对象技术来使得同一类型可以轻松地沿着两个方向变化 ...

  5. 《图解设计模式》读书笔记4-1 Bridge模式

    目录 概念 代码 角色 类图 想法 概念 Bridge模式即桥接模式.顾名思义,这个模式的作用是将类的功能层次结构和类的实现层次结构连接起来. 功能层次结构 Something -SomethingG ...

  6. Java设计模式---桥接Bridge模式

    参考于 : 大话设计模式 马士兵设计模式视频 写在开头: 桥接模式主要用于一件事物分成了两个维度,进行排列组合,比如礼物,可以分成优雅的礼物(抽象),花(具体),排列组合优雅的花! 1.为什么使用桥接 ...

  7. 设计模式--桥接(Bridge)模式

    1.概述: 桥接模式:把抽象和行为分离开来,中间需要某个介质来连接抽象化和行为化.此模式的概述听起来非常像适配器模式,不要搞混了,虽然都是借用中间介质,但意义不同.最典型的桥接模式就是:JDBC.通过 ...

  8. 漫谈设计模式(三):桥接(Bridge)模式 —— 将类功能、结构两层次分离

    1.前言 类主要有两个层次,一个是功能层次,另一个是实现层次. 功能层次,一般应用于当前类不能满足多样化的业务需求,让子类去继承(具体)父类,添加加一些父类中没有的功能(一般是增加新的方法),这就属于 ...

  9. 桥接(Bridge)模式

    桥接模式又称为柄体模式或接口模式.桥接模式的用意就是"将抽象化与实现化解耦,使得二者可以独立变化". 抽象化: 存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化 ...

随机推荐

  1. 软工实践第八次作业(课堂实战)- 项目UML设计(第五组)

    本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...

  2. HDU 5617 Jam's maze dp+滚动数组

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5617 bc(中文):http://bestcoder.hdu.edu.cn/contest ...

  3. 周总结<8>

    周次 学习时间 新编代码行数 博客量 学到知识点 15 15 100 1 Html页面设计:虚拟机:(C语言)排序 Html案例: <!DOCTYPE html PUBLIC "-// ...

  4. 关于虚拟机安装mac os 教程详解

    环境搭建 VMware下载 百度云盘下载:链接:http://pan.baidu.com/s/1pK8RcLl 密码:5jc5 Unlocker208 百度云盘下载:链接:http://pan.bai ...

  5. oracle和DB2的差异

    1.简介 当今IT的环境正经历着剧烈的变化,依靠单一的关系型数据库管理系统(RDBMS)管理数据的公司开始逐渐减少.分析家的报告指出 ,今天超过90%的公司都拥有不只一种RDBMS.在现在紧张的经济情 ...

  6. TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)

    一.概述 在RFC2861中,区分了TCP连接数据传输的三种状态   After sending a data segment:       If tcpnow - T_last >= RTO ...

  7. 《构建之法》第6~7章读后感和对Scrum的理解

    第6章 敏捷流程 “敏捷流程”是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导“敏捷”的价值观和流程, 他们肯定了流行做法的价值,但是强调敏捷的做法更能带来价值. 敏捷开发原则 ...

  8. 【第二周】关于java.util包下的Random类

    1.功能:此类的实例用于生成伪随机数流 2.方法(Random的方法有很多,在此只解释说明我认为比较常用的几个方法) (1)next(int bits):生成下一个伪随机数 (2)nextDouble ...

  9. 小程序解密 encryptedData 获取 unionID 等信息

    index.php <?php include_once "wxBizDataCrypt.php"; // $appid 由小程序微信官方后台获取 $appid = 'wx4 ...

  10. 如何在Eclipse配置PyDev插件

    如何在Eclipse配置PyDev插件 | 浏览:1733 | 更新:2014-04-21 11:36 1 2 3 4 5 分步阅读 Eclipse配置PyDev插件 方法/步骤   从 Eclips ...