본문 바로가기

알고리즘

디자인 패턴 - 책임 연쇄 패턴(Chain of Responsibility Pattern)

1. 정의

  • 한 가지의 요청을 여러 단계에서 처리해야 할 때 사용한다.

2. 예시

  • 메일을 스팸, 불편, 기본 메일로 구분한다.

3. 그림

4. 클래스 다이어그램

5. 코드

public class Client {
    public static void main(String[] args){
        Mail[] mail = new Mail[]{
                new Mail("광고", "디자인 패턴 60초 광고를 요청합니다."),
                new Mail("불편", "이 패턴 너무 불편하네요."),
                new Mail("문의사항", "요청한 패턴이 동작하지 않습니다."),
                new Mail("건의사항", "다른 패턴이 있을까요?"),
        };

        MailChain spam = new SpamMailChainImpl();
        MailChain complaint = new ComplaintMailChainImpl();
        MailChain basic = new BasicMailChainImpl();

        spam.setNextChain(complaint);
        complaint.setNextChain(basic);

        for (Mail m : mail) {
            spam.doSomething(m);
        }
    }
}
public class Mail {
    String name, contents;

    public Mail(String name, String contents) {
        this.name = name;
        this.contents = contents;
    }
}
public interface MailChain {
    void setNextChain(MailChain mailChain);
    void doSomething(Mail mail);
}
public class SpamMailChainImpl implements MailChain{

    private MailChain mailChain;

    @Override
    public void setNextChain(MailChain nextChain) {
        this.mailChain = nextChain;
    }

    @Override
    public void doSomething(Mail mail) {
        if(mail.name.contains("광고")){
            System.out.println("------");
            System.out.println("[스팸메일]");
            System.out.println(mail.name + " : " + mail.contents);

        }
        if(mailChain != null) mailChain.doSomething(mail);
    }
}
public class ComplaintMailChainImpl implements MailChain{

    private MailChain mailChain;

    @Override
    public void setNextChain(MailChain nextChain) {
        this.mailChain = nextChain;
    }

    @Override
    public void doSomething(Mail mail) {
        if(mail.name.contains("불편")){
            System.out.println("------");
            System.out.println("[불편메일]");
            System.out.println(mail.name + " : " + mail.contents);

        }
        if(mailChain != null) mailChain.doSomething(mail);
    }
}
public class BasicMailChainImpl implements MailChain{

    private MailChain mailChain;

    @Override
    public void setNextChain(MailChain nextChain) {
        this.mailChain = nextChain;
    }

    @Override
    public void doSomething(Mail mail) {
        if(!mail.name.contains("불편") && !mail.name.contains("광고")){
            System.out.println("----");
            System.out.println("[기본메일]");
            System.out.println(mail.name + " : " + mail.contents);

        }
        if(mailChain != null) mailChain.doSomething(mail);
    }
}

https://github.com/kang-seongbeom/design_pattern

💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.

6. 설명

  • 이메일의 스팸, 불편, 기본 판단을 MailChain에서 담당한다.
  • 체인이 연결된 종류 및 순서에 따라 결과가 달라질 수 있다.
  • 필요한 필터 기능이 있으면 MailChain을 확장해서 만들고, 추가하면 된다.