오늘은 관련 기사에 대한 호기심 검색에서, 책임 패턴 위키 피 디아의 사슬을 보았다,이 문서는 주로
91 대 [.NET] 도로 시리즈 및 V11의 ndash의 재구성, 책임 패턴의 체인 성가신 스위치 케이스 휴식
연습 변형, 그래서 책임 패턴의 체인 원래 디자인 아이디어는 동일하지 않습니다,하지만 같은 결과,
읽기 전에, 나는 이러한 관점에서, 최초의 91 개 기사 후에 독서 권장 그래서 그 차이를 느낄 더 수있을 것입니다.
여기에 문서의 보완 (91) 큰 끝으로 첫 번째 참조 책임의 체인의 초점의 결론을 검토,
20,120,415 보충이 : 책임의 체인이 명확 각 역할의 책임을 분할하기위한 것입니다, 각각은 자신의 일을 할 필요가 반대, 책임의 체인을 통해 방법을 결합하고 완전한 사용 시나리오는 필요로한다. 다음과 같이 역할의 책임은 다음과 같습니다 :
- 책임의 체인의 각 객체는 바로 '자신의 책임을 대신하여, 무엇을'알고, 오직 '일을해야 자신의 임무를'알고있다.
- 책임 추상 개체는 단지 그것에 대해 '계승'알고.
- 단지 알고, 현장 사용 '이 과정을 책임 체인을 호출', 당신은 원하는 결과를 얻을 수 있습니다.
책임
포인트 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) 쇄
원본 : 대형 컬럼 의 책임 패턴의 변형 [디자인 모드] 체인 - 책임 체인