Java 设计模式 之 桥接模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值