GeekIBLi

设计模式之美-桥接模式

2021-08-07

桥接模式(Bridge Pattern)

桥接模式也称为桥梁模式,接口(Integer)模式或者柄体(Handle and Body)模式,是将抽象部分和它的具体实现部分分离,是它们都可以独立地变化;

通过组合的方式建立两个类之间的联系,而不是继承; 桥接模式属于结构型模式;

继承一般来作为多继承的备用方案;

桥接模式的结构

桥接模式主要包括一下几个角色:

1、抽象角色(Abstraction): 定义抽象类,并包含一个对实现化对象的引用,正是这个引用,起着桥梁性的作用;
2、扩展抽象化(Refined Abstraction)角色

Abstraction

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class Abstraction {

protected IImplementor iImplementor;

public Abstraction(IImplementor iImplementor) {
this.iImplementor = iImplementor;
}

public void operation(){
this.iImplementor.operation();
}
}

IImplementor

1
2
3
public interface IImplementor {
void operation();
}

ConcreteImplementA

1
2
3
4
5
6
7

public class ConcreteImplementA implements IImplementor{
@Override
public void operation() {

}
}

ConcreteImplementB

1
2
3
4
5
6
7
public class ConcreteImplementB implements IImplementor{
@Override
public void operation() {

}
}

RefinedAbstraction

1
2
3
4
5
6
7
8
9
10
11
public class RefinedAbstraction extends Abstraction{

public RefinedAbstraction(IImplementor iImplementor) {
super(iImplementor);
}

@Override
public void operation() {
super.operation();
}
}

举个例子

AbstractMessage

1
2
3
4
5
6
7
8
9
10
11
12

public abstract class AbstractMessage {
private IMessage message;

public AbstractMessage(IMessage message) {
this.message = message;
}

void sendMsg(String msg,String toUser){
this.message.send(msg,toUser);
}
}

IMessage

1
2
3
public interface IMessage {
void send(String msg,String toUser);
}

SmsMessage

1
2
3
4
5
6
public class SmsMessage implements IMessage{
@Override
public void send(String msg, String toUser) {
System.err.println("使用短信消息发送 " + msg + " 发送给 " + toUser);
}
}

EmailMessage

1
2
3
4
5
6
public class EmailMessage implements IMessage{
@Override
public void send(String msg, String toUser) {
System.err.println("使用邮件消息发送 " + msg + " 发送给 " + toUser);
}
}

NormalMessage

1
2
3
4
5
6
7
8
9
10
11
public class NormalMessage extends AbstractMessage{

public NormalMessage(IMessage message) {
super(message);
}

@Override
void sendMsg(String msg, String toUser) {
super.sendMsg(msg, toUser);
}
}

UegencyMessage

1
2
3
4
5
6
7
8
9
10
public class UegencyMessage extends AbstractMessage{
void sendMsg(String msg,String toUser){
msg = "[ 加急]" + msg;
super.sendMsg(msg,toUser);
}

public UegencyMessage(IMessage message) {
super(message);
}
}

DemoTest

1
2
3
4
5
6
7
8
9
10
11
12
public class DemoTest {
public static void main(String[] args) {
IMessage message = new SmsMessage();
AbstractMessage abstractMessage = new NormalMessage(message);
abstractMessage.sendMsg("加班申请","老大");

message = new EmailMessage();
abstractMessage = new UegencyMessage(message);
abstractMessage.sendMsg("调休申请","老总");

}
}
1
2
使用短信消息发送 加班申请 发送给 老大
使用邮件消息发送 [ 加急]调休申请 发送给 老总

桥接模式的适用场景

1、在抽象和具体实现之间需要增加更多的灵活性的场景;
2、一个类在两个或者多个独立变化的维度,而这两个或多个维度都需要独立的进行拓展
3、不希望使用继承,或者因为多层继承导致系统类的个数剧增;

桥接模式的优点

1、遵循软件设计原则,分离抽象部分和具体实现部分
2、提高了系统的扩展性
3、符合开闭原则
4、符合合成复用原则 不使用继承而使用组合

桥接模式

1、增加了系统代码可读性和复杂性
2、需要正确识别交接的不同维度