java(面向对象)的23种设计模式(6)——桥接模式

java(面向对象)的23种设计模式(6)——桥接模式,第1张

java(面向对象)的23种设计模式(6)——桥接模式 一、定义

将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

桥接模式遵循了里氏替换原则、依赖倒置原则和组合重用原则,最终实现了开闭原则,对修改关闭,对扩展开放。

面向对象七大设计原则参考:java(面向对象)的23种设计模式(1)——设计原则和设计模式分类
上面这段话是不是很难理解,下面我尽可能的通过图文的方式,使上面的定义能够更简单更通透。

二、名词理解

首先,我们先理解以下几个名词。
抽象化: 抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。比如笔这个大类
实现化:针对抽象化给出的具体实现,就是实现化,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。比如毛笔这个具体的笔
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。
桥接模式中的脱耦,指用组合(或聚合)关系代替继承关系来实现,从而使两者可以相对独立地变化。

聚合关系 :聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。生命周期互不影响,比如电脑和鼠标。
组合关系:组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。比如身体和细胞的关系。
继承:子类继承父类,这个就不过多解释了。

三、模式结构&&代码分析

我看很多以画笔和颜料来举例,或者以发送消息的方式和消息类型来举例,我在这里简单解释下:
画笔和颜料:不同类型的画笔+不同颜色的颜料会产生很多很多种颜色的画笔,如果把笔和颜料区分开,那就可以利用组合的方式自由组合,比如三支笔头不一样的笔可以配十八种颜料。
如下两张图的区别:


明显下图将笔和颜料区分开,增加型号或者颜色就更加的方便。

1、UML图

2、代码分析

结合上图,我们用代码一起来理解。
(1)Implmentor接口:实现化角色
这个角色给出实现化角色的接口,但不给出具体的实现。 必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层 *** 作,而抽象化角色应当只给出基于底层 *** 作的更高一层的 *** 作。
是不是又很难理解,这么看,我只定义了颜料接口,而颜料对于笔来说,是聚合关系,是画笔的一种属性,但是呢又不定义具体是哪种颜料。
代码如下:

//Implmentor
public interface Color {
	//实现上色的方法
	public void getColor();
	}

(2)ConcreteImplementor:具体实现化角色
实现化角色接口的具体实现。此处可以定义红色蓝色黑色等等颜色。

public class RedColor implements Color {
	@Override
	public void getColor() {
		// TODO Auto-generated method stub
			System.out.println("红色的");
	}
}

(3)Abstraction:抽象化角色:
抽象化给出的定义,并保存一个对实现化对象的引用。

public abstract class Pen {
	//引用实现化接口对象——聚合关系
	private Color color;
	//设置颜色
	public void setColor(Color color) {
		this.color=color;
	}
	//画画方法
	public abstract void paint();
}

(4)RefinedAbstraction:修正抽象化角色
扩展抽象化角色,改变和修正父类对抽象化的定义。通常情况下它不再是抽像类而是具体的类。实现了在Abstraction中定义的抽象方法,也能调用implementor的业务方法。

public class BigPen extends Pen {
	@Override
	public void paint() {
		//调用Imp的颜色.
		color.getColor();
	}
}

(5)客户端实现方法

Color color = new RedColor();
Pen pen = new BigPen(color);
pen.paint();
3、使用场景

此处参考:https://www.cnblogs.com/betterboyz/p/9361784.html
桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
抽象角色可以针对任何数据库引擎发出查询指令,因为抽象角色并不直接与数据库引擎打交道,JDBC驱动器负责这个底层的工作。由于JDBC驱动器的存在,应用系统可以不依赖于数据库引擎的细节而独立地演化;同时数据库引擎也可以独立于应用系统的细节而独立的演化。

4、和适配器模式搭配

桥接模式和适配器模式用于设计的不同阶段,桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5582110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存