Java委托模型支持许多事件类型

时间:2018-02-10 03:28:14

标签: java design-patterns delegation

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

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;
        }
}

1 个答案:

答案 0 :(得分:0)

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

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>字段替换为事件类型作为键,将装饰器实现替换为值。