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");
}
}

posted @ 2012-12-07 10:03  yangkai_keven  阅读(159)  评论(0编辑  收藏  举报