목차
1. 책임 연쇄 패턴 이란?
2. 책임 연쇄 패턴 구조
3. 예제 - URL 에서 프로토콜, 도메인, 포트를 분리하기
책임 연쇄 패턴 이란?
책임 이란 무언가를 처리하는 기능을 가진 클래스
여러 개의 책임들을 동적으로 연결해서 순차적으로 실행하는 행동 디자인 패턴입니다.
기능을 클래스 별로 분리하여 구현하도록 유도하므로 클래스의 코드가 최적화 된다는 장점이 있습니다.
책임 연쇄 패턴 구조
이름 | 내용 |
Handler | 실행을 담당해줄 추상클래스 |
ProtocolHandler | 프로토콜을 찾아줄 클래스 |
DomainHandler | 도메인을 찾아줄 클래스 |
PortHandler | 포트를 찾아줄 클래스 |
Main | 메인 클래스 |
예제 - URL 에서 프로토콜, 도메인, 포트를 분리하기
Handler 추상클래스
Handler 를 저장할 nextHandler 를 필드로 가집니다.
setNext 메서드를 통해 Handler 를 할당합니다.
process 메서드를 추상 메서드로 두어 각 클래스에서 구현하게 합니다.
run 메서드를 이용하여 각 클래스에서 구현한 process 를 실행시키고, nextHandler 가 있으면 다음 Handler 를 실행하도록 코드를 구성하여 마치 체인(chain) 처럼 연결된 듯한 느낌을 줍니다.
public abstract class Handler {
private Handler nextHandler = null;
public Handler setNext(Handler handler) {
this.nextHandler = handler;
return handler;
}
abstract void process(String url);
public void run(String url) {
process(url);
if(nextHandler != null) nextHandler.run(url);
}
}
ProtocolHandler 클래스
Handler 클래스를 상속받아 process 메서드를 Override 하여 기능을 구현합니다.
public class ProtocolHandler extends Handler{
@Override
public void process(String url) {
int index = url.indexOf("://");
if(index != -1) {
System.out.println("PROTOCOL: " + url.substring(0, index));
} else {
System.out.println("NO PROTOCOL");
}
}
}
DomainHandler 클래스
ProtocolHandler 와 동일 합니다.
public class DomainHandler extends Handler{
@Override
public void process(String url) {
int startIndex = url.indexOf("://");
int lastIndex = url.lastIndexOf(":");
System.out.println("DOMAIN: ");
if(startIndex == -1) {
if(lastIndex == -1) {
System.out.print(url);
} else {
System.out.println(url.substring(0, lastIndex));
}
} else if(startIndex != lastIndex) {
System.out.println(url.substring(startIndex + 3, lastIndex));
} else if(startIndex == lastIndex) {
System.out.println(url.substring(startIndex + 3));
} else {
System.out.println("NONE");
}
}
}
PortHandler 클래스
DomainHandler 와 동일 합니다.
public class PortHandler extends Handler{
@Override
public void process(String url) {
int index = url.lastIndexOf(":");
if(index != -1) {
String strPort = url.substring(index + 1);
try {
int port = Integer.parseInt(strPort);
System.out.println("PORT: " + port);
return;
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
System.out.println("NO PORT");
}
}
Main 클래스
각 Handler 를 생성하여 setNext 메서드로 실행할 순서에 맞게 등록해줍니다.
이후 가장 앞 Handler 인 protocolHandler 를 run 메서드로 실행해 줍니다.
public class Main {
public static void main(String[] args) {
Handler protocolHandler = new ProtocolHandler();
Handler portHandler = new PortHandler();
Handler domainHandler = new DomainHandler();
protocolHandler.setNext(portHandler).setNext(domainHandler);
String url = "http://www.isStory.com:8080";
System.out.println("INPUT: " + url);
protocolHandler.run(url);
}
}
실행 결과
INPUT: http://www.isStory.com:8080
PROTOCOL: http
PORT: 8080
DOMAIN: www.isStory.com
'Design Pattern > 행위(Behavioral) 패턴' 카테고리의 다른 글
1. 반복자 패턴 ( Iterator Pattern ) (0) | 2023.10.26 |
---|