您的位置:首页 > 编程语言 > Java开发

Java 设计模式 之 桥接模式

2012-11-07 14:14 288 查看
Java 设计模式 之 桥接模式
桥接模式的本质:分离抽象与实现。
桥接模式的优点:

●分离抽象与实现部分

这样极大地提高了系统的灵活性。让抽象与实现部分独立开来,分别定义自己的接口,这有助于对系统进行分层,从而产生更好的结构

化的系统。对于系统的高级部分,只需要知道抽象部分和实现部分的接口就可以了。

●更好的扩展性

由于把抽象部分和实现部分开了,而且分别定义了接口,这就使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大

大地提高了系统的扩展性。

●可动态地切换实现

由于把抽象部分和实现部分开了,所以实现桥接的时候,就可以实现动态的选择和使用具体的实现。也就是说一个实现不再是固定地绑

定在一个抽象接口上,可以实现运行期间动态切换。

●可以减少子类的个数

对于有两个变化维度的情况,如果采用继承的实现方式,大约需要两个维度上的可变化数量的乘积个子类;采用桥接模式来实现,大约

需要两个维度上的可变化数量的和个子类。可以明显减少子类的个数。

桥接模式还很好地体现了:多用对象组合,少用对象继承。采用对象组合,松散了对象之间的耦合。
桥接模式的结构与说明
● Abstraction:抽象部分得到接口。通常在这个对象中,要维护一个实现部分的对象引用,抽象对象里面的方法,需要调用实现部分来完

成。这个对象中的方法,通常都是和具体的业务相关的方法。

●RefinedAbstraction:扩展抽象部分的接口。通常在这些对象中,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中

定义的方法,也可能需要调用实现部分的对象来完成。

● Implementor:定义实现部分的接口。这个接口不用和Abstraction中的方法一致,通常是由Implementor接口提供基本的操作。而

Abstraction中定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的业务方法,也就是说Abstractiond

定义了基于这些基本操作的较高层次的操作。

● ConcreteImplementor:真正实现Implementor接口的对象。

样例
/**

* 定义实现部分的接口,实现发送消息的统一接口

*

*/

public interface MessageImplementor{

/**

*
发送消息

* @param
message

* @param
toUser

*/

publicvoid
send(String message, String toUser);

}

/**

* 使用短消息方式发送消息

*

*/

public class MessageSMS implements MessageImplementor {

@Override

public void
send(String message, String toUser) {

System.out.println("使用短消息发送消息:" + message + "
给 " + toUser);

}

}

/**

* 以E-Mail方式发送

*

*/

public class MessageEmail implements MessageImplementor {

@Override

publicvoid
send(String message, String toUser) {

System.out.println("使用E-Mail发送消息:" + message +" 给 " + toUser);

}

}

/**

* 以手机发送消息

*

*/

public class MessageMobile implements MessageImplementor {

@Override

publicvoid
send(String message, String toUser) {

System.out.println("使用手机发送消息:" + message + "
给 " + toUser);

}

}

/**

* 抽象的消息对象

*

*/

public abstract class AbstractMessage{

/**

*
持有一个实现部分的对象

*/

protected
MessageImplementor impl;

publicAbstractMessage(MessageImplementor impl) {

this.impl = impl;

}



public void
sendMessage(String message, StringtoUser) {

this.impl.send(message,toUser);

}

}

/**

* 普通消息

*

*/

public class CommonMessage extends AbstractMessage {

publicCommonMessage(MessageImplementor impl) {

super(impl);

}



@Override

public void
sendMessage(String message, StringtoUser) {

super.sendMessage(message,toUser);

}

}

/**

* 紧急消息

*

*/

public class UrgencyMessage extends AbstractMessage {

publicUrgencyMessage(MessageImplementor impl) {

super(impl);

}

@Override

public void sendMessage(String message,String toUser) {

message = "加急:" + message;

super.sendMessage(message,toUser);

}

/**

*
扩展功能:监视消息的处理对象

* @param messageId

* @return

*/

publicObject watch(String messageId) {

return null;

}

}

public class SpecialUrgencyMessage extends
AbstractMessage {

publicSpecialUrgencyMessage(MessageImplementor impl) {

super(impl);

}

@Override

publicvoid
sendMessage(String message, String toUser) {

message = "特急:" + message;

super.sendMessage(message,toUser);

}



public void
hurry(String messageId){

//执行催促的任务,发出催促的信息

}

}

public class Client {



public static void
main(String[] args) {



//使用短信发方式

MessageImplementor impl = new
MessageSMS();



AbstractMessage m = new
CommonMessage(impl);

m.sendMessage("请喝一杯茶","Henry");



m = new
UrgencyMessage(impl);

m.sendMessage("请喝一杯茶","Henry");



m = new
SpecialUrgencyMessage(impl);

m.sendMessage("请喝一杯茶","Henry");



//使用手机方式

impl = new
MessageMobile();



m = new
CommonMessage(impl);

m.sendMessage("请喝一杯茶","Henry");



m = new
UrgencyMessage(impl);

m.sendMessage("请喝一杯茶","Henry");



m = new
SpecialUrgencyMessage(impl);

m.sendMessage("请喝一杯茶", "Henry");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: