`

桥接模式

 
阅读更多
现实中场景:发送提示消息
从业务上看,消息又分成普通消息、加急消息和特急消息多种,
不同的消息类型,业务功能处理是不一样的:
    加急消息是在消息上添加加急,而特急消息除了添加特急外,还会做一条催促的记录,多久不完成会继续催促。

从发送消息的手段上看,又有系统内短消息、手机短消息、邮件等等。


考虑简单情况:
    消息先只是实现发送普通消息,先实现系统内短消息和邮件。其它的功能
 
   
 public interface Message {   
    	public void send(String message,String toUser);   
    }

 public  class CommonMessageSMS implements Message{   
    	public void send(String message, String toUser) {   
            System.out.println("使用站内短消息的方式,发送消息'"      +message+"'给"+toUser);   
    	}   
    }
    
    public class CommonMessageEmail implements Message{   
    	public void send(String message, String toUser) {   
            System.out.println("使用Email的方式,发送消息'"  +message+"'给"+toUser);   
    	}   
    }



添加发送加急消息的功能,也有两种发送的方式,同样是站内短消息和Email的方式。
public interface UrgencyMessage extends Message{   
    public Object watch(String messageId);   
}

public class UrgencyMessageSMS implements UrgencyMessage{   
    public void send(String message, String toUser) {   
        message = "加急:"+message;   
        System.out.println("使用站内短消息的方式,发送消息'"   
		+message+"'给"+toUser);   
    }   
   
    public Object watch(String messageId) {   
        //获取相应的数据,组织成监控的数据对象,然后返回          
        return null;   
    }      
}   



public class UrgencyMessageEmail implements UrgencyMessage{   
    public void send(String message, String toUser) {   
        message = "加急:"+message;   
        System.out.println("使用Email的方式,发送消息'"   
		+message+"'给"+toUser);   
    }   
    public Object watch(String messageId) {   
        //获取相应的数据,组织成监控的数据对象,然后返回          
        return null;   
    }      
}



对于特急消息,在普通消息的处理基础上,需要添加催促的功能。
如果要实现特急消息的功能,又要新继承一个借口 并且新增两个实现类

以上继承的方式实现的缺陷是:
扩展消息的种类不太容易,不同种类的消息具有不同的业务,也就是有不同的实现.
更可怕的是,如果要新加入一种消息的发送方式,那么会要求所有的消息种类,都要加入这种新的发送方式的实现。



桥接模式定义:  将抽象部分与它的实现部分分离,使它们都可以独立地变化。
应用桥接模式来解决的思路:
示例的变化具有两个纬度,一个纬度是抽象的消息这边,包括普通消息、加急消息和特急消息,另一个纬度为消息发送方式:包括站内短消息、Email和手机短信息。

Implementor:
        定义实现部分的接口,提供基本操作
Abstraction:
        抽象部分的接口。里面定义的是基于这些基本操作的业务方法,
RefinedAbstraction
          扩展抽象部分的接口,通常在这些对象里面,定义跟实际业务相关的方法,
       
ConcreteImplementor:
         真正实现Implementor接口的对象。


public interface Implementor {   
    public void operationImpl();   
}

public abstract class Abstraction {   
    protected Implementor impl;   
    public Abstraction(Implementor impl){   
        this.impl = impl;   
    }   
    public void operation() {   
        impl.operationImpl();   
    }   
    
}
 



public class ConcreteImplementorA implements Implementor {   
    public void operationImpl() {    
        //真正的实现   
    }   
}

public class ConcreteImplementorB implements Implementor {   
    public void operationImpl() {    
        //真正的实现   
    }   
}   


public class RefinedAbstraction extends Abstraction {   
    public RefinedAbstraction(Implementor impl) {   
        super(impl);   
    }   
    /**  
     * 示例操作,实现一定的功能  
     */   
    public void otherOperation(){   
        //实现一定的功能,可能会使用具体实现部分的实现方法,   
        //但是本方法更大的可能是使用Abstraction中定义的方法,   
        //通过组合使用Abstraction中定义的方法来完成更多的功能   
    }   
}   



使用上述架构实现发送提示消息的实例如下:
//消息发送业务接口
public interface MessageImplementor {   
    public void send(String message,String toUser);   
}   

public abstract class AbstractMessage {   
       
    protected MessageImplementor impl;   
       
    public AbstractMessage(MessageImplementor impl){   
        this.impl = impl;   
    }   
       
    public void sendMessage(String message,String toUser){   
        this.impl.send(message, toUser);   
    }      
}   


public  class MessageSMS implements MessageImplementor{   
    public void send(String message, String toUser) {   
        System.out.println("使用站内短消息的方式,发送消息'"   
		+message+"'给"+toUser);   
    }   
    
    
    public class MessageEmail implements MessageImplementor{   
    public void send(String message, String toUser) {   
        System.out.println("使用Email的方式,发送消息'"   
                               +message+"'给"+toUser);   
    }   
}



public class CommonMessage extends AbstractMessage{   
    public CommonMessage(MessageImplementor impl) {   
        super(impl);   
    }   
    public void sendMessage(String message, String toUser) {   
        super.sendMessage(message, toUser);   
    }      
}


public class UrgencyMessage extends AbstractMessage{   
    public UrgencyMessage(MessageImplementor impl) {   
        super(impl);   
    }   
    public void sendMessage(String message, String toUser) {   
        message = "加急:"+message;   
        super.sendMessage(message, toUser);   
    }   
    
    public Object watch(String messageId) {   
        return null;   
    }      
}   


这样,如果我们想扩展实现发送特急消息,只需要增加一个抽象的实现:
public class SpecialUrgencyMessage extends AbstractMessage{   
    public SpecialUrgencyMessage(MessageImplementor impl) {   
        super(impl);   
    }   
    public void hurry(String messageId) {   
        //执行催促的业务,发出催促的信息   
    }   
    public void sendMessage(String message, String toUser) {   
        message = "特急:"+message;   
        super.sendMessage(message, toUser);   
        //还需要增加一条待催促的信息   
    }   
}   
  
 

如果要增加一种发送方式:比如手机发送,只需要增加一种实现就OK了
public  class MessageMobile implements MessageImplementor{   
    public void send(String message, String toUser) {   
        System.out.println("使用手机短消息的方式,发送消息'"   
		+message+"'给"+toUser);   
    }   
}   


测试功能:
public class Client {   
    public static void main(String[] args) {   
        //创建具体的实现对象   
        MessageImplementor impl = new MessageSMS();   
        //创建一个普通消息对象   
        AbstractMessage m = new CommonMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");          
        //创建一个紧急消息对象   
        m = new UrgencyMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");          
        //创建一个特急消息对象   
        m = new SpecialUrgencyMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");   
           
        //把实现方式切换成手机短消息,然后再实现一遍   
        impl = new MessageMobile();   
        m = new CommonMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");   
        m = new UrgencyMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");   
        m = new SpecialUrgencyMessage(impl);   
        m.sendMessage("请喝一杯茶", "小李");   
    }   
}   


桥接模式和策略模式的区别:
桥接模式的抽象部分,是可以继续扩展和变化的,而策略模式只有上下文,是不存在所谓抽象部分的。


分享到:
评论

相关推荐

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    桥接模式和策略模式是软件设计模式中的两种重要模式,它们在实现上有着相似之处,但各自的应用场景和设计理念有所不同。下面将详细阐述这两种模式的特点、区别以及它们在实际编程中的应用。 首先,桥接模式(Bridge...

    Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

    VMWare 6.0桥接模式虚拟机网络配置

    VMWare 6.0 桥接模式虚拟机网络配置 VMWare 6.0 桥接模式虚拟机网络配置是虚拟机网络配置中的一种简单而又重要的网络连接模式。通过以下步骤可以设置桥接模式虚拟机网络配置:首先,确保在相应虚拟机的以太网设置...

    VMware15虚拟机桥接模式无法上网问题的解决

    VMware 15虚拟机桥接模式无法上网问题 步骤 1:在设置中找到 网络和internet—>>更改适配器选项—–>>以太网 查看 共享网络给虚拟机(有些电脑不用) 步骤2:查看VMware虚拟网络编辑器的VMnet0桥接模式设置 ...

    桥接模式 C++ 实现

    桥接模式是一种设计模式,它将抽象部分与实现部分分离,使得它们可以独立进行变化。在C++中,桥接模式的应用有助于降低系统的耦合度,提高代码的可扩展性和可维护性。以下是对桥接模式及其C++实现的详细解释。 首先...

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    设计模式之桥接模式,内含可运行代码

    桥接模式是软件设计模式中的一种结构型模式,它的主要目的是为了实现抽象和实现的解耦,使得两者可以独立地进行扩展。在桥接模式中,抽象类(Abstraction)不直接引用具体实现(Implementation),而是通过一个桥接...

    Android桥接模式demo

    **Android桥接模式详解** 桥接模式是一种设计模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在Android开发中,尤其是在构建可扩展和灵活的架构时,这种模式尤其有用。本文将深入探讨桥接模式在...

    桥接模式-设计模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件设计中扮演着重要的角色,尤其是在面对需求频繁变动或系统需要支持多平台、多设备的情况下。 首先,我们要理解...

    设计模式 - 桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,使得系统具有更好的可扩展性和灵活性。 桥接模式的主要组成部分...

    设计模式的桥接模式的例子

    桥接模式是设计模式中的一种结构型模式,它旨在将抽象部分与实现部分解耦,使得它们可以独立地变化。这种模式将抽象类和它的实现类进行分离,通过一个抽象接口来连接它们,使得两者可以独立发展,增加了系统的灵活性...

    ADSL桥接模式和路由模式的区别

    "ADSL 桥接模式和路由模式的区别" 在 ADSL 宽带接入方式中,桥接模式和路由模式是两种常见的工作模式。_bridge 模式是 ADSL ROUTER 的默认工作模式,主要用于单台电脑的接入,需要代理服务器或网关设备将局域网中的...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

    设计模式之桥接模式

    桥接模式(Bridge Pattern)是设计模式中结构型模式的一种,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在Java编程中,这种模式的应用可以帮助我们构建更加灵活、可扩展的代码结构。 ...

    桥接模式例子源码

    桥接模式是一种设计模式,属于结构型模式,其主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。这种模式通过引入一个抽象化角色来实现抽象部分与实现部分的解耦,使得这两部分可以独立扩展。在这个...

    结构型模式之桥接模式(bridge)

    桥接模式是设计模式中的一种结构型模式,其主要目的是为了分离抽象部分和实现部分,以便两者能够独立地进行变化。这种模式的核心理念是通过引入一个抽象层来封装多种可能的实现,使得抽象和实现之间形成一种“桥接”...

    设计模式-桥接模式(讲解及其实现代码)

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件设计中常用于降低系统的耦合度,使得类的扩展和维护更为方便。 首先,我们理解桥接模式的核心概念。在桥接模式...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    桥接模式示意代码

    图片浏览器的接口设计-桥接模式的运用 解决问题: 一个图像格式有两个基本的方面,一是结构,二是表象。其结构决定了图像是怎样存储的,而其表象决定了图像是怎样显示在屏幕上的。对于一个图像格式(BMP、JPG等)来...

Global site tag (gtag.js) - Google Analytics