Chain of Responsibility Design Pattern
2023. 12. 5. 17:30ㆍ디자인패턴
728x90

- 핸들러들의 체인(사슬)을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴이다.
- 각 핸들러는 요청을 받으면 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지를 결정한다.
- 체인의 핸들러들을 원하는 순서로 연결할 수 있으므로 모든 요청은 계획한 대로 통과한다.
Handler
- 모든 핸들러에 공통적인 인터페이스를 선언.
- 요청을 처리하기 위한 단일 메서드만 포함되지만
때로는 체인의 다음 핸들러를 세팅하기 위한 다른 메서드가 있을 수 있다.
ConcreteHandler
- 요청을 처리하기 위한 실제 코드가 포함되어 있다.
- 요청을 받으면 이 요청을 처리할지와 함께
체인을 따라 전달할지를 결정해야 한다.
public interface Handler {
public void setHandler(Handler handler);
public void process(File file);
public String getHandlerName();
}
public class File {
private final String fileName;
private final String fileType;
private final String filePath;
public File(String fileName, String fileType, String filePath){
this.fileName = fileName;
this.fileType = fileType;
this.filePath = filePath;
}
public String getFileName() {
return fileName;
}
public String getFileType() {
return fileType;
}
public String getFilePath() {
return filePath;
}
}
public class TextFileHandler implements Handler {
private Handler handler;
private String handlerName;
public TextFileHandler(String handlerName){
this.handlerName = handlerName;
}
@Override
public void setHandler(Handler handler) {
this.handler = handler;
}
@Override
public void process(File file) {
if(file.getFileType().equals("text")){
System.out.println("Process and saving text file... by "+ handlerName);
}else if(handler!=null){
System.out.println(handlerName+" fowards request to "+ handler.getHandlerName());
handler.process(file);
}else{
System.out.println("File not supported");
}
}
@Override
public String getHandlerName() {
return handlerName;
}
}
public class DocFileHandler implements Handler{
private Handler handler;
private String handlerName;
public DocFileHandler(String handlerName){
this.handlerName = handlerName;
}
@Override
public void setHandler(Handler handler) {
this.handler = handler;
}
@Override
public void process(File file) {
if(file.getFileType().equals("doc")){
System.out.println("Process and saving doc file... by "+ handlerName);
}else if(handler!=null){
System.out.println(handlerName+" fowards request to "+ handler.getHandlerName());
handler.process(file);
}else{
System.out.println("File not supported");
}
}
@Override
public String getHandlerName() {
return handlerName;
}
}
public class ExcelFileHandler implements Handler{
private Handler handler;
private String handlerName;
public ExcelFileHandler(String handlerName){
this.handlerName = handlerName;
}
@Override
public void setHandler(Handler handler) {
this.handler = handler;
}
@Override
public void process(File file) {
if(file.getFileType().equals("excel")){
System.out.println("Process and saving excel file... by "+ handlerName);
}else if(handler!=null){
System.out.println(handlerName+" fowards request to "+ handler.getHandlerName());
handler.process(file);
}else{
System.out.println("File not supported");
}
}
@Override
public String getHandlerName() {
return handlerName;
}
}
public class TestChainofResponsibility {
public static void main(String[] args) {
File file = null;
Handler textHandler = new TextFileHandler("Text Handler");
Handler docHandler = new DocFileHandler("Doc Handler");
Handler excelHandler = new ExcelFileHandler("Excel Handler");
textHandler.setHandler(docHandler);
docHandler.setHandler(excelHandler);
file = new File("Abc.mp3", "audio", "C:");
textHandler.process(file);
file = new File("Abc.doc", "doc", "C:");
textHandler.process(file);
}
}
실행결과:
Text Handler fowards request to Doc Handler
Doc Handler fowards request to Excel Handler
Process and saving audio file... by Audio Handler
Text Handler fowards request to Doc Handler
Process and saving doc file... by Doc Handler728x90
'디자인패턴' 카테고리의 다른 글
| Bridge Design Pattern (2) | 2023.12.05 |
|---|---|
| Compound Patterns (2) | 2023.11.14 |
| Proxy Pattern (0) | 2023.11.07 |
| State pattern (0) | 2023.10.31 |
| composite pattern (0) | 2023.10.30 |