반응형

행동 패턴 - Chain of responsibility

 

해결하려는 문제

  • 메시지를 보내는 객체와 처리하는 객체를 분리하고 싶을 때
  • 하나의 메시지를 여러 객체가 처리해야 할 때

 

 

public class Main {

    public static void main(String[] args) {
        User user = new User();

        MessageSenderChain smsSenderChain = new SmsSenderChain();
        smsSenderChain.next(new PushSenderChain())
                .next(new EmailSenderChain());
        
        smsSenderChain.send(user, new MessageDetail());
    }
}
public abstract class MessageSenderChain {
    private MessageSenderChain next;
    
    public void MessageSenderChain next(MessageSenderChain next) {
        // smsSenderChain.next = pushSenderChain
        this.next = next;	// pushSenderChain
        return next;
    }
    
    public void sender(User user, MessageDetail messageDetail) {
        // TODO
        execute(user, messageDetail);
        
        // next
        if (nonNull(next)) {
            next.sent(user, messageDetail);
        }
    }
    
    protected abstract void execute(User user, MessageDetail messageDetail);
}
public class MessageDetail {
}
public class SmsSenderChain extends MessageSenderChain {
    @Override
    protected void execute(User user, MessageDetail messageDetail) {
        System.out.println("SMS 메시지 전송!");
    }
}
public class PushSenderChain extends MessageSenderChain {
    @Override
    protected void execute(User user, MessageDetail messageDetail) {
        System.out.println("PUSH 메시지 전송!");
    }
}
public class EmailSenderChain extends MessageSenderChain {
    @Override
    protected void execute(User user, MessageDetail messageDetail) {
        System.out.println("E-mail 전송!");
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ChainConfig {

    // adaptor
    // repository
    
    @Bean
    public MessageSenderChain chain() {
        MessageSenderChain chain = new SmeSenderChain();
        chain.next(new PushSenderChain())
                .next(new EmailSenderChain());
                
        return chain;
    }
}

 

 


반응형

+ Recent posts