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을 확장해서 만들고, 추가하면 된다.
'알고리즘' 카테고리의 다른 글
백준 - 24955 숫자 이어 붙이기(Java) (0) | 2022.11.22 |
---|---|
백준 - 16197 두 동전(Java) (0) | 2022.11.21 |
백준 - 19542 전단지 돌리기(Java) (0) | 2022.11.18 |
백준 - 17090 미로 탈출하기(Java) (0) | 2022.11.17 |
백준 - 12784 인하니카 공하국(Java) (0) | 2022.11.16 |