바르 [디자인 모드] 책임 패턴의 사슬 - 책임 체인

오늘은 관련 기사에 대한 호기심 검색에서, 책임 패턴 위키 피 디아의 사슬을 보았다,이 문서는 주로

91 대 [.NET] 도로 시리즈 및 V11의 ndash의 재구성, 책임 패턴의 체인 성가신 스위치 케이스 휴식

연습 변형, 그래서 책임 패턴의 체인 원래 디자인 아이디어는 동일하지 않습니다,하지만 같은 결과,

읽기 전에, 나는 이러한 관점에서, 최초의 91 개 기사 후에 독서 권장 그래서 그 차이를 느낄 더 수있을 것입니다.


 여기에 문서의 보완 (91) 큰 끝으로 첫 번째 참조 책임의 체인의 초점의 결론을 검토,

20,120,415 보충이 : 책임의 체인이 명확 각 역할의 책임을 분할하기위한 것입니다, 각각은 자신의 일을 할 필요가 반대, 책임의 체인을 통해 방법을 결합하고 완전한 사용 시나리오는 필요로한다. 다음과 같이 역할의 책임은 다음과 같습니다 :

  1. 책임의 체인의 각 객체는 바로 '자신의 책임을 대신하여, 무엇을'알고, 오직 '일을해야 자신의 임무를'알고있다.
  2. 책임 추상 개체는 단지 그것에 대해 '계승'알고.
  3. 단지 알고, 현장 사용 '이 과정을 책임 체인을 호출', 당신은 원하는 결과를 얻을 수 있습니다.


책임

포인트 2가 나는 부분을 변경하고자하는 것입니다, 시스템이 정말 지방 자 책임 체인 모드를 많이 사용해야하는 경우,

나는, 아래로 전달하는 책임이 일을 추상 개체 책임의 무리를 볼 수 있습니다

그래서 각 개체의 책임은 그들이 행해야 할 그냥 희망, 책임의 충분하지

그래서 각 개체는 추상적 인 객체가 관련 코드의 책임을 통과 상속 할 책임이 없습니다 :

        public interface IMonkey
        {
            bool DoSomething(DayOfWeek today);
        }

        public abstract class AbstractMonkey : IMonkey
        {
            public virtual bool DoSomething(DayOfWeek today)
            {
                // 是自己的责任,就做
                var result = IsMyResponsibility(today);
                if (result)
                    MyAction(today);
                return result;
            }

            protected abstract void MyAction(DayOfWeek today);
            protected abstract bool IsMyResponsibility(DayOfWeek today);
        }

        public class MonkeyMonday : AbstractMonkey
        {
            protected override void MyAction(DayOfWeek today)
            {
                Console.WriteLine("星期一,猴子穿新衣");
            }

            protected override bool IsMyResponsibility(DayOfWeek today)
            {
                return today == DayOfWeek.Monday;
            }
        }

        public class MonkeyTuesday : AbstractMonkey
        {
            protected override void MyAction(DayOfWeek today)
            {
                Console.WriteLine("星期二,猴子肚子饿");
            }

            protected override bool IsMyResponsibility(DayOfWeek today)
            {
                return today == DayOfWeek.Tuesday;
            }
        }

        public class MonkeySunday : AbstractMonkey
        {
            protected override void MyAction(DayOfWeek today)
            {
                Console.WriteLine("星期日,猴子过生日");
            }

            protected override bool IsMyResponsibility(DayOfWeek today)
            {
                return today == DayOfWeek.Sunday;
            }
        }

AbstractMonkey는 단지 시켜라 및 IsMyResponsibility을 연습해야 원숭이 연습을 필요로하는 템플릿 메소드를 사용하여 위에서 본,

프로세스 AbstractMonkey 연습 IMonkey.DoSomething 특정 일을하고 할있을 경우 반환합니다.


체인

그 위의 코드, 객체의 책임은 우리가 책임이 있고, 그 다음 내가 체인되고 싶어, 즉, 뭔가해야 :

        public class Chain
  
  
   
   
        {
            private IList
   
   
    
     _chain = new List
    
    
     
     ();

            public Chain
     
     
      
       SetNext(T item)
            {
                _chain.Add(item);
                return this;
            }

            public void Execute(Func
      
      
        doSomething) { foreach (var item in _chain) { if (doSomething(item)) break; } } } 
      
     
     
    
    
   
   
  
  

 체인 의도는 그래서이 다음 객체를 설정 한 다음 특정 객체 반환 정지하고 있는지 여부를 확인하기 위해 위임 매개 변수를 실행 사용하는 SetNext 책임을 '물려'하는 것입니다.


용도

        static void Main(string[] args)
        {
            var today = DateTime.Today.DayOfWeek;
            var monkeyChain = new Chain
  
  
   
   ()
                .SetNext(new MonkeyMonday())
                .SetNext(new MonkeyTuesday())
                .SetNext(new MonkeySunday());

            monkeyChain.Execute(monkey => monkey.DoSomething(today));
        }
  
  

먼저 SetNext와 함께 IMonkey 연습, 함께 IMonkey.DoSomething 체인을 통해 구현에 대한 책임을 중독됩니다.

결과


개요

책임의 주요 체인으로 분할이는 책임 체인의 변형입니다

책임의 체인이 더 이상 부담을 작성할 수 있도록 책임의 체인을 사용하려면,

다음 반복 사용 후 체인 (91 참고 예로서 코드의 많은 부분) 코드를 삭감 할 수있다 :

1. 다음 개체 책임에 대한 코드를 설정 쓰기 생성자 (또는 방법)의 사용을 줄일 수 있습니다.

        public AbstractMonkey(AbstractMonkey monkey)
        {
            this._nextMonkey = monkey;
        }

2. 개인 필드 개체의 필드 코드에 저장 쓰기 할 책임을 줄일 수 있습니다.

private AbstractMonkey _nextMonkey;

3. 책임 개체 아래 코드 실행을 작성하는 방법을 줄일 수 있습니다.

        public void DoSomething(DayOfWeek today)
        {
            if (isMyResponsibility(today))
            {
                this.MyAction(today);
            }
            else
            {
                if (this._nextMonkey != null)
                {
                    this._nextMonkey.DoSomething(today);
                }
                else
                {
                    Console.WriteLine("责任链接束!");
                }

            }
        }


참조 기사

[.NET] 도로 시리즈 V11 및 ndash를 재건하는 단계; 책임 패턴의 체인 성가신 스위치 케이스 휴식

디자인 패턴 책임 패턴 (17) 쇄

원본 : 대형 컬럼  의 책임 패턴의 변형 [디자인 모드] 체인 - 책임 체인


추천

출처www.cnblogs.com/chinatrump/p/11505160.html