java Chain of responsibility pattern 실습해보기
오늘은 java로 Chain of responsibility pattern, 즉 책인 연쇄 패턴에 대하여 실습해보려고 합니다.
객체간의 결합을 느슨하게 해주기 위한 방식으로서, 여러 객체가 요청을 처리하도록 맡겨두는 패턴입니다.
try catch문이 이 패턴과 유사한 패턴이라고 합니다.
코드
이번 코드는 계산기의 덧셈만 예시로 들면서 작성해보았습니다.
public abstract class Calc {
private Calc calc;
abstract protected boolean operator(Request request);
public boolean process(Request request) {
if (operator(request)) {
return true;
} else {
if (calc != null)
return calc.operator(request);
}
return false;
}
}
접근 지정자가 private인 Calc 클래스 타입의 변수를 만들고, operator 추상 메소드도 만듭니다.
process 메소드로 calc 변수에 값이 존재한다면 추상화한 operator 메소드에 인자를 넣어서 반환합니다.
public class Request {
private int i,j;
private String string;
public Request(int i, int j, String string) {
super();
this.i = i;
this.j = j;
this.string = string;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int getJ() {
return j;
}
public void setJ(int j) {
this.j = j;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
숫자를 저장할 정수형 변수 두개와 덧셈을 체크할 문자열 변수를 private으로 선언합니다. 그리고 생성자를 만들어줍니다.
getter와 setter를 만들어서 private 변수에 접근할 수 있는 메소드도 만들어줍니다.
public class PlusCalc extends Calc {
@Override
protected boolean operator(Request request) {
if(request.getString().equals("+")){
int a = request.getI();
int b = request.getJ();
int result = a + b;
System.out.println(result);
}
return false;
}
}
덧셈을 맡은 클래스에서는 String 변수에 접근한 getter 메소드에서 문자열을 비교해서 덧셈을 수행합니다.
public class Main {
public static void main(String[] args) {
Calc plus = new PlusCalc();
Request request1 = new Request(1,2,"+");
Request request2 = new Request(10,2,"-");
plus.process(request1);
plus.process(request2);
}
}
메인 클래스에서는 덧셈 객체를 만들어서 요청을 받습니다.
하지만, 아직 뺄셈은 만들지 않았으므로 두번째 요청은 받아들여지지 않습니다.
Written on February 13, 2018