前言
前面已经学了结构型模式、适配器模式
适配器模式是为了将类转变成客户需要的类
现在继续学习桥接模式
目录
现实案例
画画时,需要大、中、小三种大小的画笔,需要3种颜色
如果使用蜡笔,就需要9种蜡笔
如果使用毛笔,仅需准备3种不同大小的毛笔
(大致的例子)
使用蜡笔就是普通的方法,使用毛笔就是我们的桥接模式
桥接模式
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化,又称为柄体(Handle and Body)模式或接口(Interface)模式
上面的例子是对于两者维度(大小,颜色)的变化的系统
如果采用蜡笔绘画:
而桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量
UML图:
结构
桥接模式包含5个角色:
- Abstraction:抽象类
- RefinedAbstraction:扩充抽象类
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
- Client : 客户(使用者)
使用案例
使用桥接模式完成上面的例子
客户想使用什么类型就直接在客户类Client依赖
package com.company.Structural.Bridge;
//桥接模式
//实现类接口
interface Color{
public void color();
}
//3个颜色具体实现类
class Yellow implements Color{
@Override
public void color() {
System.out.println("颜色为Yellow");
}
}
class Red implements Color{
@Override
public void color() {
System.out.println("颜色为Red");
}
}
class Blue implements Color{
@Override
public void color() {
System.out.println("颜色为Blue");
}
}
//抽象类
abstract class Pen{
private Color color;
public Pen(Color color) {
this.color = color;
}
public void draw(){
color.color();
}
}
//3种型号的抽象类扩充
class SmallPen extends Pen{
public SmallPen(Color color) {
super(color);
}
@Override
public void draw() {
super.draw();
System.out.println("画笔型号为small");
}
}
class MiddlePen extends Pen{
public MiddlePen(Color color) {
super(color);
}
@Override
public void draw() {
super.draw();
System.out.println("画笔型号为Middle");
}
}
class BigPen extends Pen{
public BigPen(Color color) {
super(color);
}
@Override
public void draw() {
super.draw();
System.out.println("画笔型号为Big");
}
}
//客户开始绘画
public class Client {
public static void main(String[] args) {
Pen pen1=new BigPen(new Yellow());
pen1.draw();
}
}
代码明显减低多了
桥接模式的优缺点
优点:
- 分离抽象接口及其实现部分
- 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
- 实现细节对客户透明,可以对用户隐藏实现细节
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性
使用场景
-
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
-
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
-
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
-
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
一些应用
- Java语言的跨平台性
这就是桥接模式的思想
各个应用程序可以调用操作系统,就是使用桥(Java虚拟机)
- JDBC驱动
程序能够使用数据库就是使用桥(JDBC驱动)
JDBC的driver接口,从桥接模式看,driver接口就是实现类接口,Mysql数据库、SqlServer数据库等就是具体实现类
适配器模式与桥接模式
前面学习的适配器模式
重点在与将不适合的类转变为客户需要的类,一般在程序设计的中期
桥接模式
重点在架起一个桥梁,将两个维度的变化分为抽象化和实现化两个角色,便于结合
,一般运用程序设计的初期
所以两种模式可以结合使用
总结
- 结构型模式- 桥接模式的作用将抽象部分与它的实现部分分离,让两个维度的变化可以分隔开,然后结合,简化程序,通俗的说就是将两种维度变化分开,然后架起一个桥梁连接
- 桥接模式有5个角色:实现类接口,具体实现类(完成一个维度的变化),抽象类(聚合实现类接口),扩充抽象类(完成另一个维度变化),客户类
- 桥接模式的优点:分离抽象接口及其实现部分;提高了系统的可扩充性;实现细节对客户透明
- 桥接模式的缺点:增加系统的理解与设计难度(需要识别两个维度的变化)
- 桥接模式适用场景:需要在构件的抽象化角色和具体化角色之间增加更多的灵活性(不像蜡笔那样静态的继承关系);
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响;
当存在存在两个独立变化的维度;
不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统