设计模式入门之桥接模式Bridge


Abstraction:抽象部分的父类,定义需要实现的接口。维护对实现部分的引用,从而把实现桥接到Implementor中去

Implementor:实现部分的接口

RefinedAbstraction:扩展抽象部分的接口

ConcreteImplementorA/B:真正实现Implementor接口的对象

//桥接模式定义:将抽象部分与它的实现部分分离,使得他们都可以独立地变化。抽象部分只定义出需要实现什么方法(非抽象方法),相当于只给出一个方法的接口,接口中去调用桥接过来的具体实现类去实现,从而实现灵活的扩展性
//广义来讲,桥接模式非常普遍,面向抽象编程,面向接口编程就可以看作是他的体现
//实例:一个系统,要按照不同的要求发信息(普通,加急,特急),而且还要以不同的方式发送(站内信,Email,短信)等,考虑到其扩展性,用桥接模式再合适不过了
//上代码
//桥接的一半---抽象部分
public abstract class AbstractionMessage {
	protected MessageImplementor impl;
	public AbstractMessage(MessageImplementor impl) {
		this.impl = impl;
	}
	public void sendMessage(String message, String toUser) {
		this.impl.send(message, toUser);
	}
}
//发送消息的统一接口,即桥接的另一半---实现的接口
public interface MessageImplementor {
	public void send(String message, String toUser);
}
//桥接的另一半---实现
public class MessageSMS implements MessageImplementor {
	public void send(String message,String toUser) {
		System.out.println("使用站内信方式,发送消息'"+message+"'给"+toUser);
	}
}
//桥接的另一半---实现
public class MessageEmail implements MessageImplementor {
	public void send(String message,String toUser) {
		System.out.println("使用邮件方式,发送消息'"+message+"'给"+toUser);
	}
}
//普通消息
public class CommonMessage extends AbstractionMessage {
	public CommonMessage(MessageImplementor impl) {
		super(impl);
	}
	public void sendMessage(String message, String toUser) {
		super.sendMessage(message, toUser);
	}
}
//加急消息
public class UrgencyMessage extends AbstractionMessage {
	public UrgencyMessage(MessageImplementor impl) {
		super(impl);
	}
	public void sendMessage(String message, String toUser) {
		super.sendMessage(message, toUser);
	}
	public Object watch(String messageId) {
		return null;//获取相应的数据,组织成监控的对象,然后返回
	}
}
//客户端测试类
public class Client {
	public static void main(String[] args) {
		MessageImplementor impl = new MessageSMS();
		AbstractionMessage m = new CommonMessage(impl);
		m.sendMessage("测试", "小李");

		MessageImplementor impl2 = new MessageEmail();
		AbstractionMessage m2 = new UrgencyMesssage(impl2);
		m2.sendMessage("测试", "小李");
	}
}
//从客户端的调用可以看出来,不管是要增加消息类型还是发送消息的方式,完全是件非常简单的事情,因为没有耦合,扩展起来非常轻松。
//关于谁来桥接
//1.由抽象部分的对象自己来创建相应的Implementor对象,根据参数判断具体创建哪个
//2.在Abstraction中创建默认的Implementor对象,如果需要,让子类来修改
//3.使用抽象工厂或简单工厂
//4.使用IoC/DI方式
//Java中的JDBC就是非常典型的桥接应用
//桥接模式的本质:分离抽象和实现
//桥接模式很好地提现了开闭原则OCP
//优点:
//1.分离抽象和实现部分
//2.更好的扩展性
//3.可动态地切换实现
//4.减少子类的个数
//使用桥接模式的场景
//1.如果你不希望在抽象部分和实现部分采用固定的绑定关系,可以采用桥接模式
//2.如果出现抽象部分和实现部分都能够扩展的情况,可以采用桥接模式
//3.如果希望实现部分的修改不会对客户产生影响,可以采用桥接模式
//4.如果采用继承的实现方案,会导致产生很多子类,对于这种情况,也可采取桥接模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值