为什么需要桥接(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. asp.net如何实现跟踪检查用户知否查看了邮件。

    有时我们有这样一种需求场景,我们给很多用户发了邮件,需要一个反馈,用户是否查看了我们发送的邮件,百度了以下果然有方案. 我总结实践了下这个过程,同时有自己的一点使用感受.记录下希望对你有帮助. 有人想 ...

  2. Destoon 模板存放规则 及 语法参考

    模板存放规则及语法参考 一.模板存放及调用规则 模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板 模板文件以 .htm ...

  3. 条形码生成库 BarcodeLib

    官方介绍 在ASP.NET,Windows,Reporting Service,Crystal Reports 和 RDLC Reports应用程序中轻松生成条形码 生成准确的条形码图像,并可以保存为 ...

  4. 百度editor编辑器添加新字体

    Ueditor本身自带11种字体,添加如下: 1.找到文件 ueditor/lang/zh-cn/zh-cn.js ,添加字体 'fontfamily': {        'songti': '宋体 ...

  5. 【Python】Python的time和datetime模块

    time 常用的有time.time()和time.sleep()函数. import time print(time.time()) 1499305554.3239055 上面的浮点数称为UNIX纪 ...

  6. vue中axios复用封装

    ajax2: function() { let that = this; return that .$http({ method: "get", url: "/Home/ ...

  7. hive 一次性命令

    1.用hive查询,而不进入hive cli,查询后的值可以保存到文件中 #使用参数-e [hadoop@bigdata-senior01 ~]$ hive -e "select * fro ...

  8. 【BZOJ1396】识别子串&【BZOJ2865】字符串识别(后缀自动机)

    [BZOJ1396]识别子串&[BZOJ2865]字符串识别(后缀自动机) 题面 自从有了DBZOJ 终于有地方交权限题了 题解 很明显,只出现了一次的串 在\(SAM\)的\(right/e ...

  9. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  10. arp 投毒实验

    1.查看kali2.0和kali2.0.0的IP地址,如图1和图2,其中192.168.1.133作为攻击者,192.168.1.109作为PC访问FTP服务器192.168.1.234 图1 图2 ...