为什么需要桥接(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. this & super

    /* 当本类的成员和局部变量同名用this区分. 当子父类中的成员变量同名用super区分父类.   this和super的用法很相似.   this:代表一个本类对象的引用. super:代表一个父 ...

  2. Redis 请求应答模式和往返延时 Pipelining

    Redis是一个CS结构的TCP服务器,使用”请求-应答”的模式.,客户端发起一个请求是这样的步骤: 客户端发送一个请求给服务器,然后等待服务器的响应,一般客户端使用阻塞模式来等待服务器响应. 服务器 ...

  3. ONS发布订阅消息

    ONS, 全名Open Notification Service, 是阿里基于开源消息中间件RocketMQ的一个云产品. 首先,要申请阿里账号等.本地也可以申请阿里云账号自己调试.此处为公司拥有阿里 ...

  4. 【.Net】HttpClient 的使用

    class Program { public static HttpClient Client; static HttpResponseMessage response; static void Ma ...

  5. java catch 捕获异常后会产生一个实例对象 该对象能使用父类的方法

  6. Linux进入单用户模式(passwd root修改密码)

    进入单用户模式——passwd root修改密码 1.在grub 页面输入a,进入修改内核模式 2.在内核的结尾“/”,输入空格,在输入single,回车 3.启动系统,进入单用户模式 4.Passw ...

  7. C++解析(12):初始化列表与对象构造顺序、析构顺序

    0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的 ...

  8. Qt浅谈内存泄露(总结)

    Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...

  9. VLC for Android 编译过程

    首先,给一个VLC的官网链接:VLC-AndroidCompile 上面有编译所需要安装的插件,环境变量的配置等等信息:虽然是英语,但也挺好理解,这里就不再详述:此文主要记录我在编译的过程中遇到的一些 ...

  10. 洛谷 P1233 木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...