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;//获取对应的数据,组织成监控的对象,然后返回
}
}
//client測试类
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("測试", "小李");
}
}
//从client的调用能够看出来,无论是要添加消息类型还是发送消息的方式,全然是件很easy的事情,由于没有耦合,扩展起来很轻松。
//关于谁来桥接
//1.由抽象部分的对象自己来创建对应的Implementor对象,依据參数推断详细创建哪个
//2.在Abstraction中创建默认的Implementor对象。假设须要。让子类来改动
//3.使用抽象工厂或简单工厂
//4.使用IoC/DI方式
//Java中的JDBC就是很典型的桥接应用
//桥接模式的本质:分离抽象和实现
//桥接模式很好地提现了开闭原则OCP
//长处:
//1.分离抽象和实现部分
//2.更好的扩展性
//3.可动态地切换实现
//4.降低子类的个数
//使用桥接模式的场景
//1.假设你不希望在抽象部分和实现部分採用固定的绑定关系,能够採用桥接模式
//2.假设出现抽象部分和实现部分都能够扩展的情况,能够採用桥接模式
//3.假设希望实现部分的改动不会对客户产生影响。能够採用桥接模式
//4.假设採用继承的实现方案,会导致产生许多子类。对于这样的情况。也可採取桥接模式