독서노트22: 직책 체인 모드

1. 정의: 여러 대상이 요청을 처리할 수 있는 기회를 주어 요청의 발송자와 수신자 간의 결합 관계를 피한다.대상을 하나의 체인으로 연결하고, 대상이 그것을 처리할 때까지 이 체인을 따라 요청을 전달합니다.다들 if라고 써주셨을 거라 믿고...else나 switch, 조건이 많을 때 수십 줄의 코드를 써야 합니다.만약 어떤 조건이나 처리 과정을 수정하려면, 또 끊임없이 이 작살의 지엽적인 문장을 수정해야 한다.이때 우리는 직책 체인 모델을 채택할 수 있다. 그것은 많은 요청의 지점이나 절차를 독립시킬 수 있다.그리고 독립된 부분마다 최종 처리라면 직접 처리하고 끝내고 그렇지 않으면 다음 처리 절차를 연결한다.이렇게 하면 요청을 처리하는 체인이 형성된다.2. 캐릭터Handler-요청을 처리하는 인터페이스.CreateHandler - 지시를 처리하는 인터페이스의 클래스입니다.그것은 여러 가지가 있는데, 하나하나가 하나의 처리 절차를 대표하고, 그것의 조건을 만족시키지 못할 때, 요청을 다른 단계에 맡길 수 있다.이 체인이 끊기지 않도록 보증합니다.3. 프로그램 모델: 추상 인터페이스
    public abstract class Handler
    {
        protected Handler successor;

        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

        public abstract void HandlerRequest(object request);
    }

구체적인 실현류는 완전한 직책 체인의 한 부분이다.
    public class CreateHandler0 : Handler
    {
        public override void HandlerRequest(object request)
        {
            string value = request as String;

            Regex regex = new Regex(@"[\u4e00-\u9fa5]", RegexOptions.IgnoreCase);

            if (regex.IsMatch(value))
            {
                Console.WriteLine(string.Format(@"'{0}'  ", value));
            }
            else
            {
                successor.HandlerRequest(request);
            }
        }
    }

    public class CreateHandler1 : Handler
    {
        public override void HandlerRequest(object request)
        {
            string value = request as String;

            Regex regex = new Regex(@"^\d+$", RegexOptions.IgnoreCase);

            if (regex.IsMatch(value))
            {
                Console.WriteLine(string.Format(@"{0}   ", int.Parse(value)));
            }
            else
            {
                successor.HandlerRequest(request);
            }
        }
    }

    public class CreateHandler2 : Handler
    {
        public override void HandlerRequest(object request)
        {
            Console.WriteLine(string.Format(@"{0}  。",request));
        }
    }

호출:
  static void Main(string[] args)
        {
            Handler handler0 = new CreateHandler0();

            Handler handler1 = new CreateHandler1();

            Handler handler2 = new CreateHandler2();

            handler0.SetSuccessor(handler1);

            handler1.SetSuccessor(handler2);

            string string1 = " ";

            string string2 = "110";

            string string3 = "++--";

            Console.WriteLine(" :{0}",string1);

            handler0.HandlerRequest(string1);

            Console.WriteLine(" :{0}", string2);

            handler0.HandlerRequest(string2);

            Console.WriteLine(" :{0}", string3);

            handler0.HandlerRequest(string3);

            Console.Read();
        }

 
이렇게 하면 요청 절차에 대해 수시로 증가하거나 수정할 수 있어 처리 대상의 유연성을 강화할 수 있다.구조적으로 보면 건설자 모델과 유사한 것들이 있는데 모두 절차를 분리한다.다만 건설자는 뒤를 가리킬 필요가 없다.모델 코드:http://download.csdn.net/detail/yysyangyangyangshan/4173863

좋은 웹페이지 즐겨찾기