今日は責任パターンウィキペディアのチェーンを見て、関連する記事のための好奇心の検索の下で、この記事では主です
91大[.NET]道路シリーズV11とのndashの再構成は、責任のパターンのチェーンと迷惑なスイッチケースを破ります
バリアントの練習なので、Chain of Responsibilityパターンとオリジナルのデザインのアイデアは同じではありませんが、同じ結果、
だから、読む前に、私はこのような観点で、違いを感じることがよりできるようになる、最初の91件の大記事の後に読んでお勧めします。
ここでは、物品の補完的な91大エンドへの最初の参照は、責任の連鎖の焦点の結論を確認するために、
20120415補足:責任の連鎖が明らか各役割の責任を分割することを意図して、各オブジェクトは、唯一の責任のチェーンを通して方法を組み合わせることが、自分のことを行う必要があり、完全な利用シナリオが必要です。次のような役割の責任は以下のとおりです。
- 責任のチェーン上の各オブジェクトには、単に「自らの責任者に代わって、何のために」知っている、とだけ「やるべき任務」を知っています。
- 責任抽象オブジェクトは、唯一それについて「受け継が」知っています。
- 「責任の連鎖このプロセスを呼び出す」だけ知っている、シーンを使用して、あなたが望む結果を得ることができます。
責任
ポイント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は単にMyActionと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.DoSomethingチェーンを通じ実施する責任をIMonkeyます。
結果
概要
責任は大手チェーンに分割してこれは、責任の連鎖の変異体であり、
責任の連鎖がこれ以上の負担を書くためになるように、責任の連鎖を使用するためには、
以下は、繰り返し使用後にチェーンコード(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) - 鎖
オリジナル:大コラム -責任の連鎖の責任パターンのバリエーション[デザインモード]チェーン