【问题标题】:Java delegation model to support many Event Types支持多种事件类型的 Java 委托模型
【发布时间】:2018-07-20 21:05:00
【问题描述】:

我有一个类需要根据事件名称添加其他属性。可以有许多事件名称。如何更好地设计这个类,以便它支持未来的轻松增强和维护。

public class MessageDecoratorServiceImpl implements MessageaDecorator {

        @Override
        public BaseMessage addMessageProperties(BaseMessage inputMessage ){

            return decorateMessage(inputMessage);
        }
        BaseMessage decorateMessage(BaseMessage inputMessage) {
            if(inputMessage.getEventName().equals("NewSubscription")) {
                decorateSubscription(inputMessage);
            }else if( inputMessage.getEventName().equals("NewContact") ) {
                decorateNewContact(inputMessage);
            }

        }
        BaseMessage decorateSubscription(BaseMessage inputMessage) {
            inputMessage.getProperties().put("customFiled", "customValue");
            return inputMessage;
        }
        BaseMessage decorateNewContact(BaseMessage inputMessage) {
            inputMessage.getProperties().put("contactCustomFiled", "value");
            return inputMessage;
        }
}

【问题讨论】:

    标签: java design-patterns delegation


    【解决方案1】:

    您可以按事件类型创建不同的装饰器实现。 它减少了它们之间的耦合。

    public class MessageDecoratorSubscription implements MessageDecorator {    
            @Override
            public BaseMessage addMessageProperties(BaseMessage inputMessage ){
                inputMessage.getProperties().put("customFiled", "customValue");
                return inputMessage;
            }    
    }
    
    
    public class MessageDecoratorNewContact implements MessageDecorator {    
            @Override
            public BaseMessage addMessageProperties(BaseMessage inputMessage ){
                inputMessage.getProperties().put("contactCustomFiled", "value");
                return inputMessage;
            }    
    }
    

    并将它们调用为:

    new MessageDecoratorSubscription(myBaseMessage);
    

    new MessageDecoratorNewContact(myBaseMessage);
    

    现在添加/删除/更改事件处理不会影响其他人。

    关于这些条件语句:

    if(inputMessage.getEventName().equals("NewSubscription")) {
        decorateSubscription(inputMessage);
    }else if( inputMessage.getEventName().equals("NewContact") ) {
        decorateNewContact(inputMessage);
    }
    

    应该避免这种情况。它容易出错。
    您可以将它们替换为 Map<String, MessageDecorator> 字段,其中事件类型作为键,装饰器实现作为值。

    【讨论】:

    • 感谢您的帮助。如果我想在运行时添加一些事件方法怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多