Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用于消息传递API的桥接模式_Java_Rest_Bridge - Fatal编程技术网

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

Java 应用于消息传递API的桥接模式,java,rest,bridge,Java,Rest,Bridge,我希望将桥接模式应用于一个项目,基本上我希望这个项目能够触发对多个不同通道的请求 例如,我想创建可以是SMS、电子邮件或Viber的消息,例如。。。很明显,每一个都是一个信息,但是每一个都有一些不同的东西,所以我想把桥应用到那里 桥型正确吗?如果是,如何实施?如果还需要使用另一个,请让我知道如何在这种情况下使用它 谢谢大家! DISCLAMER这个例子是根据我对桥接模式的理解构建的。如果你觉得我没有给出一个合适的定义,请让我知道,我会很高兴地删除它 桥模式是一个很好的猜测,但不适用于对象。您可

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

例如,我想创建可以是SMS、电子邮件或Viber的消息,例如。。。很明显,每一个都是一个信息,但是每一个都有一些不同的东西,所以我想把桥应用到那里

桥型正确吗?如果是,如何实施?如果还需要使用另一个,请让我知道如何在这种情况下使用它


谢谢大家!

DISCLAMER这个例子是根据我对桥接模式的理解构建的。如果你觉得我没有给出一个合适的定义,请让我知道,我会很高兴地删除它

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

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

public class SmsMessage extends Message {
   /* ... */
}
桥接模式可能有用的地方是当您想要实际发送消息时。您可能需要不同的协议来发送不同的消息,所以实现桥接模式是一个好主意

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

假设您的发送逻辑纠结在一个3000行的类中,每次您想要发送消息时,您需要检查它是什么类型的消息,以通过正确的协议发送。嗯,添加一个新的消息类型,比如
flyingdigemessage
,将是一个真正的难题,因为您需要替换检查要发送的消息的所有代码

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

首先,我们需要定义我们的桥梁。在我们的例子中,它可以是一个实现简单方法
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了,这段代码在语法上可能不正确,但我希望它能提供一个很好的例子。

为什么需要一个模式?这个简单的层次结构就是有效的。桥接模式只是使用聚合,而不是创建新的类来组合想法,我不知道在这里要组合什么。事实上,这更有意义!非常感谢你对尼古拉斯的帮助!