Проектирование сложных систем обмена сообщениями с использованием шаблонов мостов

Шаблоны проектирования

Эта статья взята из статьи «Вот как следует изучать шаблоны проектирования».

Например, мы часто общаемся с коллегами через сообщения электронной почты, текстовые сообщения или сообщения в системе во время обычной офисной работы. Особенно при прохождении некоторых процессов утверждения нам необходимо записывать эти процессы для дальнейшего использования. По типу сообщения можно разделить на сообщения электронной почты, короткие сообщения и внутрисистемные сообщения. Однако по степени срочности сообщения можно разделить на обычные сообщения, срочные сообщения и специальные срочные сообщения. Очевидно, что всю систему сообщений можно разделить на два измерения, как показано на следующем рисунке.

file

Если мы используем наследование, ситуация усложняется и не способствует расширению. Сообщения электронной почты могут быть обычными или ускоренными; SMS-сообщения могут быть обычными или ускоренными. Ниже мы используем режим моста для решения этой проблемы. Сначала создайте интерфейс IMessage, который будет действовать как мост.


/**
 * 实现消息发送的统一接口
 */
public interface IMessage {
    //要发送的消息的内容和接收人
    void send(String message, String toUser);
}

Чтобы создать сообщение электронной почты, реализуйте класс EmailMessage.


/**
 * 邮件消息的实现类
 */
public class EmailMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用邮件消息发送" + message + "给" + toUser);
    }
}

Создайте SMS-сообщение, реализующее класс SmsMessage.


/**
 * 短信消息的实现类
 * SMS(Short IMessage Service)短信消息服务
 */
public class SmsMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用短信消息发送" + message + "给" + toUser);
    }
}

Затем создайте класс AbstractMessage, соединяющий абстрактную роль.


/**
 * 抽象消息类
 */
public abstract class AbstractMessage {
    //持有一个实现部分的对象
    IMessage message;

    //构造方法,传入实现部分的对象
    public AbstractMessage(IMessage message) {
        this.message = message;
    }

    //发送消息,委派给实现部分的方法
    public void sendMessage(String message, String toUser) {
        this.message.send(message, toUser);
    }
}

Создайте конкретную реализацию класса NomalMessage обычного сообщения.


/**
 * 普通消息类
 */
public class NomalMessage extends AbstractMessage {

    //构造方法,传入实现部分的对象
    public NomalMessage(IMessage message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        //对于普通消息,直接调用父类方法发送消息即可
        super.sendMessage(message, toUser);
    }
}

Создайте конкретную реализацию класса UrgencyMessage.


/**
 * 加急消息类
 */
public class UrgencyMessage extends AbstractMessage {

    //构造方法
    public UrgencyMessage(IMessage message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        message = "加急:" + message;
        super.sendMessage(message, toUser);
    }

    //扩展它功能,监控某个消息的处理状态
    public Object watch(String messageId) {
        //根据给出的消息编码(messageId)查询消息的处理状态
        //组织成监控的处理状态,然后返回
        return null;
    }
}

Наконец, напишите тестовый код клиента.


 public static void main(String[] args) {
        IMessage message = new SmsMessage();
        AbstractMessage abstractMessage = new NomalMessage(message);
        abstractMessage.sendMessage("加班申请速批", "王总");

        message = new EmailMessage();
        abstractMessage = new UrgencyMessage(message);
        abstractMessage.sendMessage("加班申请速批", "王总");
}

Результат работы показан на рисунке ниже.

file

В приведенном выше случае мы использовали шаблон моста, чтобы отделить два независимо меняющихся параметра «тип сообщения» и «срочность сообщения». Если в будущем появятся другие типы сообщений, такие как WeChat, DingTalk и т. д., вы можете напрямую создать новый класс для наследования IMessage; если необходимо добавить срочность, вам нужно только создать новый класс для реализации AbstractMessage сорт.

Следуйте «Архитектуре Тома» и ответьте на «Шаблон проектирования», чтобы получить полный исходный код.

[Рекомендация] Архитектура бомбы Тома: 30 реальных случаев шаблонов проектирования (с исходным кодом), бросающих вызов годовой зарплате в 60 Вт — это не мечта

Эта статья является оригиналом "Архитектуры бомбы Тома", пожалуйста, указывайте источник при перепечатке. Технология заключается в обмене, я разделяю свое счастье! Если эта статья полезна для вас, пожалуйста, подпишитесь и поставьте лайк, если у вас есть какие-либо предложения, вы также можете оставить комментарий или личное сообщение Ваша поддержка является движущей силой для меня, чтобы продолжать творить. Обратите внимание на «архитектуру бомбы Тома», чтобы получить больше технической галантереи!