应用于消息传递的桥接模式 API
Bridge Pattern applied to messaging API
我希望为一个项目应用桥接模式,基本上我希望这个项目能够触发对多个不同渠道的请求。
例如,我想创建可以是 SMS、电子邮件或 Viber 的消息...显然它们中的每一个都是一条消息,但每个都有一些不同的东西,所以我想要 Bridge在那里申请。
桥梁模式是否正确?如果是,如何实施?如果要使用另一个,也请让我知道如何在这种情况下使用它。
谢谢!
DISCLAMER 这个例子是根据我对桥接模式的理解构建的。如果您觉得我没有给出合适的定义,请告诉我,我会很乐意将其删除。
桥接模式是一个不错的猜测,但不适用于您的对象。您可以简单地使用多态性来创建一个抽象 Message
class。 class 可以在您的所有特定对象中扩展。
public abstract class Message {
/* ... */
}
public class SmsMessage extends Message {
/* ... */
}
当您真正想要发送消息时,桥接模式可能会派上用场。您可能需要不同的协议来发送不同的消息,因此实施桥接模式是个好主意。
桥接模式的好处是泛化一些classes,那样的话,如果你需要添加一个新的类型class es,使用它的代码没有改变。
假设您的发送逻辑纠结成 3000 行 class,并且每次您要发送消息时,您都需要检查它是什么类型的消息,以通过正确的协议发送。好吧,添加一个新的消息类型,比如 FlyingPigeonMessage
会很痛苦,因为您需要替换所有检查要发送的消息的代码。
另一方面,如果您的 3000 行 classes 永远不知道它们是什么类型的消息,只知道它们是 MESSAGE,那么他们添加新类型就像在公园里散步一样。考虑到这一点,这里是桥接模式的简单实现。
首先,我们需要定义我们的桥梁。在我们的例子中,它可以是一个实现简单方法的接口 send
.
public interface IMessageProvider {
public void send(Message message)
}
然后我们需要创建该接口的不同实现,每种类型的消息一个。在这里,我只打算构建 SMS class 因为这是一个示例。
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,这段代码在语法上可能无效,但我希望它能提供一个很好的例子。
我希望为一个项目应用桥接模式,基本上我希望这个项目能够触发对多个不同渠道的请求。
例如,我想创建可以是 SMS、电子邮件或 Viber 的消息...显然它们中的每一个都是一条消息,但每个都有一些不同的东西,所以我想要 Bridge在那里申请。
桥梁模式是否正确?如果是,如何实施?如果要使用另一个,也请让我知道如何在这种情况下使用它。
谢谢!
DISCLAMER 这个例子是根据我对桥接模式的理解构建的。如果您觉得我没有给出合适的定义,请告诉我,我会很乐意将其删除。
桥接模式是一个不错的猜测,但不适用于您的对象。您可以简单地使用多态性来创建一个抽象 Message
class。 class 可以在您的所有特定对象中扩展。
public abstract class Message {
/* ... */
}
public class SmsMessage extends Message {
/* ... */
}
当您真正想要发送消息时,桥接模式可能会派上用场。您可能需要不同的协议来发送不同的消息,因此实施桥接模式是个好主意。
桥接模式的好处是泛化一些classes,那样的话,如果你需要添加一个新的类型class es,使用它的代码没有改变。
假设您的发送逻辑纠结成 3000 行 class,并且每次您要发送消息时,您都需要检查它是什么类型的消息,以通过正确的协议发送。好吧,添加一个新的消息类型,比如 FlyingPigeonMessage
会很痛苦,因为您需要替换所有检查要发送的消息的代码。
另一方面,如果您的 3000 行 classes 永远不知道它们是什么类型的消息,只知道它们是 MESSAGE,那么他们添加新类型就像在公园里散步一样。考虑到这一点,这里是桥接模式的简单实现。
首先,我们需要定义我们的桥梁。在我们的例子中,它可以是一个实现简单方法的接口 send
.
public interface IMessageProvider {
public void send(Message message)
}
然后我们需要创建该接口的不同实现,每种类型的消息一个。在这里,我只打算构建 SMS class 因为这是一个示例。
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,这段代码在语法上可能无效,但我希望它能提供一个很好的例子。