桥接模式应用于消息传递 API

问题描述

我希望将桥接模式应用于一个项目,基本上我希望这个项目能够触发对多个不同渠道的请求。

例如,我想创建可以是 SMS、电子邮件或 Viber 的消息……显然它们中的每一个都是一条消息,但每个都有一些不同的东西,所以我想在那里应用 Bridge .

enter image description here

桥接模式正确吗?如果是,如何实施?如果应该使用另一个,也请告诉我如何在这种情况下使用它。

谢谢!

解决方法

免责声明 这个例子是根据我对桥接模式的理解构建的。如果您觉得我没有给出合适的定义,请告诉我,我会很乐意将其删除。

桥接模式是一个很好的猜测,但不适用于您的对象。您可以简单地使用多态来创建抽象 Message 类。此类可以在您的所有特定对象中扩展。

public abstract class Message {
    /* ... */
}

public class SmsMessage extends Message {
   /* ... */
}

桥接模式的用处在于您想要实际发送消息时。您可能需要不同的协议来发送不同的消息,因此实现桥接模式是个好主意。

桥接模式的好处是泛化一些类,这样,如果您需要添加这些类的新类型,使用它的代码不会改变。

假设您的发送逻辑纠缠在一个 3000 行的类中,并且每次您想要发送消息时,您都需要检查它是什么类型的消息,以通过正确的协议发送。好吧,添加一个新的消息类型,比如 FlyingPigeonMessage 会很痛苦,因为您需要替换检查要发送什么消息的每个代码。

另一方面,如果您的 3000 行类永远不知道它们是什么类型的消息,只知道它们是 MESSAGE,那么他们添加新类型就是在公园里散步。考虑到这一点,这里是桥接模式的一个简单实现。

首先,我们需要定义我们的桥。在我们的例子中,它可以是一个实现简单方法 send 的接口。

public interface IMessageProvider {
    public void send(Message message)
}

然后我们需要创建该接口的不同实现,每种类型的消息一个。这里我只构建 SMS 类,因为这是一个示例。

public class SmsMessageProvider implements IMessageProvider {
    @override
    public void send(Message message) {
        /* call a sms service or somehting... */
    }
}

一旦我们有多个提供者,我们需要一种根据给定条件实例化它们的方法。我喜欢为此使用工厂,您可以将一个对象传递给它,然后根据它的类型,您可以获得特定的实现。


/**
* Creates message providers.
*/
public class MessageProviderFactory {
    public static IMessageProvider getProviderForMessage(Message message) {
        // we return an implementation of IMessageProbvider depending on the type of message.
        if(message instanceOf SmsMessage) {
            return new SmsMessageProvider();
        } else {
            // other types of message
        }
    }
}

现在,我们有一个桥接接口,我们有实现,我们有一个工厂。我们所需要的只是发送消息。桥接模式的美妙之处在于调用 send 方法的函数不需要确切知道它拥有什么对象。这使得维护起来更容易。

public class Application() {
    public static void main(String[] args) {
        Message message;
        Boolean isSendingSMS = true; // user prefer sms over email

        // we build the message depending on the config.
        if(isSendingSMS) {
            message = new SmsMessage("my awesome message");
        } else {
            /* ... */
        }

        // will send the message we built.
        Application.sendMessage(message);
    }

    public static void sendMessage(Message message) {
        // for a given message,we retreive the appropriate provider
        IMessageProvider provider = MessageProviderFactory.getProviderForMessage(message);
        // using this provider we send the message
        provider.send(message);
    }
}

最后,我们最终通过正确的提供者发送消息,而无需实际知道它是哪个提供者。我们使用桥接模式来构建提供者,并使用简单的多态来构建我们的对象。

注意我很长时间没有使用 Java,这段代码在语法上可能无效,但我希望它提供一个很好的例子。