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 {

@Overridepublic void send(String message, String toUser) {System.out.println("使用短消息发送消息:" + message + " 给 " + toUser);}}/*** 以E-Mail方式发送**/public class MessageEmail implements MessageImplementor {

@Overridepublicvoid send(String message, String toUser) {System.out.println("使用E-Mail发送消息:" + message +" 给 " + toUser);}}

/*** 以手机发送消息**/public class MessageMobile implements MessageImplementor {

@Overridepublicvoid 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);}@Overridepublic void sendMessage(String message, StringtoUser) {super.sendMessage(message,toUser);}}/*** 紧急消息**/public class UrgencyMessage extends AbstractMessage {

publicUrgencyMessage(MessageImplementor impl) {super(impl);}

@Overridepublic 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);}

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

如果说人生啊,尝过一回痛快淋漓的风景,

Java 设计模式之桥接模式

相关文章:

你感兴趣的文章:

标签云: