为什么需要桥接(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. 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    #include<iostream> using namespace std; //#define maxn 2000010 #include<stdio.h> //int a ...

  2. MQTT协议-----订阅

    MQTT协议笔记之订阅      http://www.blogjava.net/yongboy/archive/2014/04/12/412351.html MQTT - chszs的专栏    h ...

  3. MySQL 基于xtrabackup备份—热备工具

    xtrabackup(仅对InnoDB存储引擎支持热备) percona公司开发 改进的MySQL分支:percona-server 存储引擎改进:InnoDB —> XtraDB 使用本地的R ...

  4. 复利计算C语言转java的相关代码

    static void principal()// 计算本金 { int N, m; double i, F, P; System.out.printf("复利终值:"); F = ...

  5. 第八次JAVA语言笔记

  6. laravel连接多个不同数据库的单例类

    在連接多個不同數據庫時,需要寫多個連接,爲了簡化該操作,可以使用該基類,不同的數據庫只要建立好相對應的類繼承該類,就可以使用ORM模型進行操作了. class singletonInstance { ...

  7. 【vue】this与that 一个坑

    [转载自]:https://blog.csdn.net/qq_30378229/article/details/78429374 在Vue中this始终指向Vue,但axios中this为undefi ...

  8. c语言基础笔记

    一 :数据类型 1.float类型,在输出的时候可以使用 .数字  来把浮点数精确到小数点后几位,比如 printf("%.3f",float)精确到小数点后三位,不足补0 2.字 ...

  9. perf的采样模式和统计模式

    perf的采样模式和统计模式 统计模式和采样模式使用寄存器的方法不相同; 在统计模式下,每次调度之前设置寄存器,调度之后清理寄存器,留个下个进程使用;PMU寄存器的使用方法; 在采样模式下,每次 pm ...

  10. Android四大组件之Service(续)

    本地服务启动和通过广播的方式回调是非常简单的. 下面介绍远程服务和通过远程回调的方式通知activity的方式. 1.service定义: package com.joyfulmath.globals ...