해당 포스트는 "자바 객체지향 디자인 패턴", "JAVA 언어로 배우는 디자인 패턴 입문" 책의 내용을 요약한 것이다.



※ 책임 연쇄/사슬 패턴

: 어떤 명령을 받았을 때 각각의 처리 객체에서 처리할 수 있으면 처리하고, 처리할 수 없으면 다음 처리 객체로 넘기는 패턴이다. 처리 객체들은 서로 사슬처럼 연결되어 있어 먼저 처리하는 객체에서 처리할 수 없으면 다음에 연결된 처리객체로 명령을 넘긴다.(링크드 리스트와 비슷하다)

 

ex) error에 대해 로그를 출력해주는 예제

 

public class Error{
   private int errNum;
 
   public Error(int errNum){
      this.errNum = errNum;
   }
   public int getErrNum(){
      return errNum;
   }
   public String toString(){
      return "[Error " + errNum + " ]";
   }
}

public abstract class Logger{
   private int errNum;
   private String errStr;
   private Logger next;

   public Logger(int errNum, String errStr){
       this.errNum = errNum;
       this.errStr = errStr;
   }
   public Logger setNext(Logger next){
       this.next = next;
       return next;
   }
   public int getErrNum(){
       return errNum;
   }
   //해당 메서드에서 에러를 처리해준다. 체인구조로 되어 있다.
    public boolean log(Error error){
       if(process(error)){
          return true;
       }else if(next != null){
           return next.log(error);
       }
      return false;
    }
    //실제 에러 처리에 관한 로그를 생성해주는 메서드
    protected abstract boolean process(Error error);
    
    public String toString(){
          return "Error Name is " + errStr;
    }
}
class StdoutLogger extends Logger{
  public StdoutLogger(int errNum){
      super(errNum, "Stdout");
  }
  protected boolean process(Error error){
     if(this.getErrNum() == error.getErrNum(){
         System.out.prinltn(error.toString() + this);
         return true;
      }
     return false;
   }
}

class StdinLogger extends Logger{
  public StdinLogger(int errNum){
      super(errNum, "Stdout");
  }
  protected boolean process(Error error){
     if(this.getErrNum() == error.getErrNum(){
         System.out.prinltn(error.toString() + this);
         return true;
      }
     return false;
   }
}
public class Main{
   public static void main(String[] args){
      Error error1 = new Error(1);
      Error error2 = new Error(2);
     
      Logger logger = new StdoutLoggger(1); 
      logger.setNext(new StdinLogger(2));
 
      logger.log(error1);
      logger.log(error2);
    }
}

 

'자바 > 디자인패턴' 카테고리의 다른 글

스트래티지(Strategy, 전략) 패턴  (0) 2017.07.01
디자인 패턴  (0) 2017.06.29
생성자의 인자가 많을 시 빌더 패턴  (0) 2017.06.08
플라이웨이트 패턴  (0) 2017.06.08
퍼사드 패턴  (0) 2017.06.08

+ Recent posts