图解Java设计模式之桥接模式

图解Java设计模式之桥接模式

手机操作问题

现在对不同手机类型的不同品牌实现操作编程(比如 :开机、关机、上网、打电话等等),如图 :

传统方案解决手机操作问题

传统方法对应的类图

传统方案解决手机操作问题分析

1)扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。
2)违反类单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加类代码维护成本。
3)解决方案 - 使用桥接模式

桥接模式(Bridge)-基本介绍

1)桥接模式(Bridge 模式)是指 : 将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
2)是一种结构型设计模式
3)Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

说明 :
1)Client类 :桥接模式的调用者。
2)抽象类(Abstraction) :维护了Implementor / 即它的实现类ConcreteImplementorA…,二者是聚合关系,Abstraction充当桥接类。
3)RefinedAbstraction :是Abstraction抽象类的子类。
4)Implementor :行为实现类的接口
5)ConcreteImplementor A/ B : 行为的具体实现类
6)从UML图 :这里的抽象类和接口是聚合的关系,其实调用和被调用关系

桥接模式解决手机操作问题

使用桥接模式改进传统方式,让程序具有很好的扩展性,利用程序维护
1)应用实例和前面一样
2)使用桥接模式对应的类图

package com.example.demo.bridge;

/**
 * 接口
 * @author zhaozhaohai
 *
 */
public interface Brand {

	void open();
	void close();
	void call();
}
package com.example.demo.bridge;

public class Vivo implements Brand{

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手机开机");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手机关机");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("Vivo手机打电话");
	}

}
package com.example.demo.bridge;

public class XiaoMi implements Brand{

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("小米手机开机");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println("小米手机关机");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("小米手机打电话");
	}

}
package com.example.demo.bridge;

public abstract class Phone {

	/**
	 * 组合品牌
	 */
	private Brand brand;

	public Phone(Brand brand) {
		this.brand = brand;
	}

	protected void open() {
		this.brand.open();
	}

	protected void close() {
		this.brand.close();
	}

	protected void call() {
		this.brand.call();
	}
}
package com.example.demo.bridge;

/**
 * 折叠式手机类,继承抽象类Phone
 * @author zhaozhaohai
 *
 */
public class FoldedPhone extends Phone{

	public FoldedPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}
	public void open() {
		super.open();
		System.out.println(" 折叠样式手机 ");
	}

	public void close() {
		super.close();
		System.out.println(" 折叠样式手机 ");
	}

	public void cell() {
		super.call();
		System.out.println(" 折叠样式手机 ");
	}
}
package com.example.demo.bridge;

public class UpRightPhone extends Phone{

	public UpRightPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}

	public void open() {
		super.open();
		System.out.println(" 直立样式手机 ");
	}

	public void close() {
		super.close();
		System.out.println(" 直立样式手机 ");
	}

	public void cell() {
		super.call();
		System.out.println(" 直立样式手机 ");
	}

}
package com.example.demo.bridge;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 获取折叠式手机(样式 + 品牌)
		Phone phone1 = new FoldedPhone(new XiaoMi());
		phone1.open();
		phone1.call();
		phone1.close();

		Phone phone2 = new FoldedPhone(new Vivo());
		phone2.open();
		phone2.call();
		phone2.close();

		Phone phone3 = new UpRightPhone(new XiaoMi());
		phone3.open();
		phone3.call();
		phone3.close();
	}

}

桥接模式在JDBC中的源码解析





桥接模式的注意事项和细节

1)实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
2)对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它部分由具体业务来完成。
3)桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
4)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
5)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

桥接模式其它应用场景

1)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
2)常见的应用场景 :
JDBC驱动程序
银行转账系统 :
转账分类 : 网上转账,柜台转账,AMT转账(抽象)
转账用户类型 :普通用户,银卡用户,金卡用户(实现)
消息管理
消息类型 :即时消息,延时消息(抽象)
消息分类 :手机短信,邮件消息,QQ消息(实现)

原文地址:https://www.cnblogs.com/haizai/p/12540294.html

时间: 2024-08-17 21:34:57

图解Java设计模式之桥接模式的相关文章

图解Java设计模式之原型模式

图解Java设计模式之原型模式 克隆羊的问题 原型模式 - 基本介绍 原型模式在Spring框架中源码分析 浅拷贝的介绍 深拷贝基本介绍 克隆羊的问题 现在有一只羊tom,姓名为 : tom,年龄为 :1,颜色为 :白色,请编写程序创建和tom羊属性完全相同的10只羊. 传统方式解决克隆羊的问题 package com.example.demo.prototype; public class Sheep { private String name; private int age; privat

图解Java设计模式之组合模式

图解Java设计模式之组合模式 看一个学校院系展示需求 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 组合模式的原理类图 组合模式解决学校院系展示的应用实例 组合模式在JDK集合的源码分析 组合模式的注意事项和细节 看一个学校院系展示需求 编写程序展示一个学校院系结构 :需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系.如图 : 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 1)将学院看

Java设计模式:桥接模式

问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何来描述这些功能呢?或许一般会与下面代码相似. public class A1 { void F1(){} void F2(){} } public class A2 { void F1(){} void F2(){} } 很明显,若有m个事物,n个功能,按照这个方法,一共要写m个类,功能方法累积起来

java设计模式之桥接模式

桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响.我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法.其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆. 桥接模式所涉及的角色有:抽象化(Abstraction)角色:抽象化给出的

java设计模式_桥接模式

现在的手机,按照操作系统分,有ios,有android,还有window phone等. 如果是按软件来分的话,就有通讯录,游戏等. 按继承的思维来考虑的话,如下: 但是问题来了,如果是按照手机品牌来分的话,增加一个新的手机品牌的话,意味着不仅要增加手机品牌,还要增加改手机品牌的通讯录和游戏. 若按照手机软件来分的话,同样,增加一个新的软件的话,意味着不仅要增加新的软件,还要增加各个品牌手机对应的通讯录和游戏. 通过桥接模式的话,若增加软件,则只需要增加软件即可,若增加品牌,只需增加品牌即可.

Java设计模式应用——桥接模式

性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也可以是mppdb入库. 针对不同场景,我们可以灵活选择不同的采集,汇聚,入库方式.这种一个功能需要多种服务支持,每种服务又有不同类型的实现,使用桥接模式再适合不过. (注:这里仅仅是桥接模式的例子,实际应用中,采集.汇聚.入库时异步执行的,他们之间通过消息通信) 桥接模式,顾名思义,就是把每种服务看

JAVA设计模式之 桥接模式【Bridge Pattern】

一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式. 二.适用场景 处理多维度变化. 业务场景:某功能为将数据库中的数据转换成多种文件格式,例如txt.xml.pdf等格式,同时需要支持多种不同类型的数据库的读取.便可使用桥接模式对其进行设计. 这里的维度有两个 分别为:不同的文件格式 和 不同的数据库类型.如下图: 三.UML类图 桥接模式通用结构图: 针对上面的业务场景-桥接模式-示例结构图: 四.参与者

java设计模式之-----桥接模式

一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又不增加复杂度,这就要引入“Bridge”桥接模式. 二.模式角色 Abstraction: 1.定义抽象接口: 2.拥有一个Impl类型对象引用. RefinedAbstraction 1.扩展Abstraction的接口定义: Implementor 1.Implementor是具体实现的接口,I

浅谈JAVA设计模式之——桥接模式(Bridge)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45457969 一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充. 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充. 3.对一