引入
JDBC是以统一方式访问数据库的API.是一种退化的桥接模式
它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracle数据库专门写一个程序,为访问Sybase数据库又专门写一个程序等等,只需要用JDBC API写一个程序就够了,它可以向相应数据库发送SQL调用.JDBC是Java应用程序与各种不同数据库之间进行对话的方法的机制.
桥接模式原理
系统有多维角度分类时,而每一种分类又有可能变化,考虑使用桥接模式 桥接的目的是分离抽象与实现,使抽象和实现可以独立变化。
桥接模式的优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端透明,可以对用户隐藏实现细节。
桥接模式的缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
使用桥梁模式的场景
不用桥接模式的写法
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public interface Message { public void send(String message, String toUser); }
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public interface UrgencyMessage extends Message { public Object monitor(String messageId); }
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public class UrgencyMessageSMS implements UrgencyMessage { public Object monitor(String messageId) { return null; } public void send(String message, String toUser) { message = "加急:" + message; System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public class UrgencyMessageEmail implements UrgencyMessage { public Object monitor(String messageId) { return null; } public void send(String message, String toUser) { message = "加急:" + message; System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public class CommonMessageSMS implements Message { public void send(String message, String toUser) { System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public class CommonMessgaeEmail implements Message { public void send(String message, String toUser) { System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
用桥接模式的写法:
package com.lzhsite.technology.designPattern.bridgems.OAMessage; public class CommonMessgaeEmail implements Message { public void send(String message, String toUser) { System.out.println("使用邮件短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public abstract class AbstractMessage { protected MessageImplementor impl; protected AbstractMessage(MessageImplementor impl) { this.impl = impl; } public void sendMessage(String message, String toUser) { this.impl.send(message, toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public class SpecialUrgencyMessage extends AbstractMessage { protected SpecialUrgencyMessage(MessageImplementor impl) { super(impl); } public void hurry(String messageId) { } public void sendMessage(String message, String toUser) { message = "特急:" + message; super.sendMessage(message, toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public class CommonMessage extends AbstractMessage { protected CommonMessage(MessageImplementor impl) { super(impl); } public void sendMessage(String message, String toUser) { super.sendMessage(message, toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public interface MessageImplementor { public void send(String message, String toUser); }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public class MessageMobile implements MessageImplementor { public void send(String message, String toUser) { System.out.println("使用手机短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }
package com.lzhsite.technology.designPattern.bridgems.OAMessgaeBridge; public class MessageSMS implements MessageImplementor { public void send(String message, String toUser) { System.out.println("使用系统内短消息的方法,发送消息 '" + message + "' 给 " + toUser); } }