看完这篇文章后 深受启发 ,可以先参阅一下http://www.cnblogs.com/pony1223/p/7530721.html
1、简介
简单地说,桥接模式就是把抽象和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。例如:
//new Driver() 可填写各种数据库的driver 统一由JDBC的DriverManger管理
java.sql.DriverManager.registerDriver(new Driver());
类图:
- 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
使用场景:如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,也就是让这两个层次解耦,通过桥接模式可以使它们在抽象层建立一个关联关系。 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适合。
2、具体实现
现在有这么一个发消息的场景,消息分为QQ消息和Email消息,要求是可以对消息进行过滤。
//建立消息接口
interface Message{
public void send(String msg);
}
//qq消息
class QQmessage implements Message{
@Override
public void send(String msg) {
System.out.println("我发QQ消息");
}
}
//email消息
class EmailMessage implements Message{
@Override
public void send(String msg) {
System.out.println("我发Email消息");
}
}
abstract class MessageTool{
//这里有一个需要注意的点啊 对具体类的引用不能设为私有 设为共有
public Message message = null;
public MessageTool(Message message){
this.message = message;
}
public void send(String msg){
message.send(msg);
}
}
//假设这里我要对消息进行过滤 消息中不能有敏感词汇
class MessageFilterTool extends MessageTool{
public MessageFilterTool(Message message) {
super(message);
}
public void send(String msg){
/*
过滤消息。。。。。。。。。。
*/
message.send(msg);
}
}
class Client{
public static void main(String[] args) {
new MessageFilterTool(new QQmessage()).send("Ok"); //过滤QQ消息
}
这里可以看出来对消息操作的逻辑完全和消息类型解耦,消息这边是一个体系,操作消息即 ‘MessageTool’ 又是另外一个体系。
下面如果我想用手机 或者电脑发消息。
//用手机发消息
class PhoneMessageSystem extends MessageTool{
public PhoneMessageSystem(Message message) {
super(message);
}
public void send(String msg){
System.out.println("我正在用手机");
message.send("Ok");
}
}
//用电脑发消息
class ComputerMessageSystem extends MessageTool{
public ComputerMessageSystem(Message message) {
super(message);
}
public void send(String msg){
System.out.println("我正在用电脑");
message.send("Ok");
}
}
class Client{
public static void main(String[] args) {
// new MessageFilterTool(new QQmessage()).send("Ok"); //过滤QQ消息
new PhoneMessageSystem(new EmailMessage()).send("Ok"); //用手机发Email
}
}
可以看到,增加消息工具这边的逻辑 完全不影响消息那边的逻辑。
如果要对消息类型扩展,只需要实现Message接口即可,而且不影响消息工具这边的逻辑,非常灵活。
3、总结
总的来说,桥接模式有以下优点
● 分离抽象和实现部分
桥梁模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性。让抽象部分和实现部分独立出来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。
● 更好的扩展性
桥梁模式使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大提高了系统的可扩展性。