一、桥接模式
1、定义
桥接模式(Bridge Pattern)又称作桥梁模式
,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。
桥接模式的主要目的是通过组合的方式建立两个类之间的联系,而不是继承,但又类似多重继承方案。
桥接 模式的核心在于把抽象与实现解耦。这里的抽象与实现指的是两种独立变化的维度。
2、结构
(1)模式的结构
主要角色如下:
- 抽象角色(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类。
- 修正角色(RefinedAbstraction):Abstraction的具体实现,对 Abstraction的方法进行完善和扩展。
- 实现角色(IImplementor):确定实现维度的基本操作,提供为 Abstraction使用。一般为接口或者抽象类。
- 具体实现角色(ConcreteIImplementor):IImplementor的具体实现。
3、优缺点
优点:
- 分离抽象部分及其具体实现部分。
- 提高了系统的扩展性。
- 符合开闭原则。
- 符合合成复用原则。
缺点:
- 增加了系统的理解与设计难度。
- 需要正确地是识别系统中两个独立变化的维度。
4、使用场景
- 在抽象和具体实现之间需要增加更多灵活性的场景。
- 一个类存在两个或者多个独立变化的维度,而这两个或者多个维度都需要独立进行扩展。
5、在框架源码中使用
- JDBC API源码中的 Driver类就是桥接对象。
二、模式的通用实现
代码如下:
public class BridgePattern {
public static void main(String[] args) {
ConcreteIImplementorA iImplementorA = new ConcreteIImplementorA();
// 组合/聚合实现
RefinedAbstraction abstraction = new RefinedAbstraction(iImplementorA);
abstraction.operation();
}
}
// 抽象角色
abstract class Abstraction {
// 实现角色的引用
protected IImplementor iImplementor;
public Abstraction(IImplementor iImplementor) {
this.iImplementor = iImplementor;
}
public void operation(){
iImplementor.operationImpl();
}
}
// 修正角色
class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(IImplementor iImplementor) {
super(iImplementor);
}
@Override
public void operation() {
super.operation();
// do something
System.out.println("RefinedAbstraction do something");
}
}
// 实现角色
interface IImplementor{
void operationImpl();
}
// 具体实现角色
class ConcreteIImplementorA implements IImplementor{
@Override
public void operationImpl() {
System.out.println("ConcreteIImplementorA----do");
}
}
class ConcreteIImplementorB implements IImplementor{
@Override
public void operationImpl() {
System.out.println("ConcreteIImplementorB----do");
}
}
三、模式的应用实例
(1)消息-实现角色
public interface IMessage {
void send(String message, String toUser);
}
(2)邮件消息-具体实现角色
public class EmailMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println("使用邮件消息发送:" + message + " 给 " + toUser);
}
}
(3)短信消息-具体实现角色
public class SMSMessage implements IMessage {
@Override
public void send(String message, String toUser) {
System.out.println("使用短信消息发送:" + message + " 给 " + toUser);
}
}
(4)桥接抽象角色
public class AbstractMessage {
protected IMessage iMessage;
public AbstractMessage(IMessage iMessage) {
this.iMessage = iMessage;
}
// 发送消息,委派给实现部分的方法
public void sendMessage(String message, String toUser) {
this.iMessage.send(message, toUser);
}
}
(5)具体普通消息-修正角色
public class NomalMessage extends AbstractMessage {
public NomalMessage(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String message, String toUser) {
// 普通消息,直接调用父类发送即可
super.sendMessage(message, toUser);
}
}
(6)具体加急消息-修正角色
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(IMessage iMessage) {
super(iMessage);
}
@Override
public void sendMessage(String message, String toUser) {
message = "【加急】" + message;
super.sendMessage(message, toUser);
// do something
}
}
(7)测试
public static void main(String[] args) {
IMessage emailMessage = new EmailMessage();
AbstractMessage nomalMessage = new NomalMessage(emailMessage);
nomalMessage.sendMessage("野王求让buff", "赵云");
IMessage smsMessage = new SMSMessage();
AbstractMessage urgencyMessage = new UrgencyMessage(emailMessage);
urgencyMessage.sendMessage("野王请求支援", "赵云");
}
– 求知若饥,虚心若愚。