桥接设计模式

一、桥接模式

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("野王请求支援", "赵云");
	}

在这里插入图片描述

– 求知若饥,虚心若愚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值