Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input.Responsibilities;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators.Chains;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators.Interfaces;
using static GofPattern.Behavioral.ChainOfResponsibilityPattern.Enums.ChainOrchestratorHandleOptions;
using static GofPattern.Behavioral.ChainOfResponsibilityPattern.Enums.ChainOrchestratorInvokeNextOptions;

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input;

internal class ChainOfResponsibilityExample : AbstractExample
{
protected override void Steps()
{
var orchestrator = GetOrchestrator();

// Foo - Responsibility
// Handle >>> Always
// Invoke Next >>> Always
orchestrator.Append(new ResponsibilityFoo(Logger), HandleAlways, InvokeNextAlways);

// Bar - Responsibility
// Handle >>> WhenResponsible
// Invoke Next >>> WhenNotResponsible
orchestrator.Append(new ResponsibilityBar(Logger), HandleWhenResponsible, InvokeNextWhenNotResponsible);

// FooBar - Responsibility
// Handle >>> WhenResponsible
// Invoke Next >>> WhenNotResponsible
orchestrator.Append(new ResponsibilityFooBar(Logger), HandleWhenResponsible, InvokeNextWhenNotResponsible);

SetBeforeHandling(orchestrator);
SetAfterHandling(orchestrator);

Logger.LogInformation("------------- START Orchestrator -------------");
Chain = orchestrator.Chain;

// Start with >>> Foo
// HandleAlways >>>> Foo (Executes)
// Invokes >> Bar
// IsResponsible >>>>> Bar (Executes)
// !!! Stops
orchestrator.Execute("Bar");

Logger.LogInformation("------------- START Orchestrator -------------");
Chain = orchestrator.Chain;

// Start with >>> Foo
// HandleAlways >>>> Foo (Executes)
// Invokes >> Bar
// IsNotResponsible >> Bar (Not Executes)
// Invokes >> FooBar
// IsResponsible >>>>> FooBar (Executes)
// !!! Stops
orchestrator.Execute("FooBar");
}

private void SetBeforeHandling(IResponsibilityChainActionBeforeHandling<string> orchestrator)
{
orchestrator.ActionBeforeHandling = () =>
{
Logger.LogInformation("---- Responsibility Chain ----");
Logger.LogInformation(GetChainDetail());
};

orchestrator.ActionInputBeforeHandling =
input => Logger.LogInformation($"Executing before with input '{input}'.");
}

private void SetAfterHandling(IResponsibilityChainActionAfterHandling<string> orchestrator)
{
orchestrator.ActionInputAfterHandling =
input => Logger.LogInformation($"Executing before with input '{input}'.");

orchestrator.ActionAfterHandling = MoveToNext;
}

private string GetChainDetail()
{
return
$"Name({Chain!.Name}), HandleOption({Chain!.HandleOption}), InvokeNextHandlerOption({Chain!.InvokeNextHandlerOption}).";
}

private void MoveToNext()
{
Chain = Chain?.Next;
}

private ResponsibilityChain<string>? Chain { get; set; }

private static IResponsibilityChainOrchestrator<string> GetOrchestrator() =>
new ResponsibilityChainOrchestrator<string>();
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input.Responsibilities;

internal abstract class AbstractResponsibilityInput : IResponsibility<string>
internal abstract class AbstractResponsibility : IResponsibility<string>
{
private readonly ICustomLogger log;
private readonly string name;

internal AbstractResponsibilityInput(ICustomLogger log, string name)
protected AbstractResponsibility(ICustomLogger log, string name)
{
this.log = log;
this.name = name;
Expand All @@ -18,6 +18,6 @@ internal AbstractResponsibilityInput(ICustomLogger log, string name)

public void Handle(string input)
{
log.LogInformation($"Handling '{input}' by '{name}'");
log.LogInformation($"Handled '{input}' by '{name}'");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input.Responsibilities;

internal class ResponsibilityBar : AbstractResponsibilityInput
internal class ResponsibilityBar : AbstractResponsibility
{
internal ResponsibilityBar(ICustomLogger log) : base(log, nameof(ResponsibilityBar)) { }
public ResponsibilityBar(ICustomLogger log) : base(log, nameof(ResponsibilityBar)) { }

public override bool IsResponsible(string input)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input.Responsibilities;

internal class ResponsibilityFoo : AbstractResponsibilityInput
internal class ResponsibilityFoo : AbstractResponsibility
{
internal ResponsibilityFoo(ICustomLogger log) : base(log, nameof(ResponsibilityFoo)) { }
public ResponsibilityFoo(ICustomLogger log) : base(log, nameof(ResponsibilityFoo)) { }

public override bool IsResponsible(string input)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Input.Responsibilities;

internal class ResponsibilityFooBar : AbstractResponsibilityInput
internal class ResponsibilityFooBar : AbstractResponsibility
{
internal ResponsibilityFooBar(ICustomLogger log) : base(log, nameof(ResponsibilityFooBar)) { }
public ResponsibilityFooBar(ICustomLogger log) : base(log, nameof(ResponsibilityFooBar)) { }

public override bool IsResponsible(string input)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.Responsibilities;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators.Chains;
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators.Interfaces;

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput;

internal class ChainOfResponsibilityExample : AbstractExample
{
protected override void Steps()
{
var orchestrator = GetOrchestrator();

orchestrator.Append(new ResponsibilityFoo());
orchestrator.Append(new ResponsibilityBar());
orchestrator.Append(new ResponsibilityFooBar());

SetBeforeHandling(orchestrator);

Logger.LogInformation("------------- START Orchestrator -------------");
Chain = orchestrator.Chain;

// Start with >>> Foo
// IsNotResponsible >> Foo (Not Executes)
// Invokes >>> Bar
// IsResponsible >>>>> Bar (Executes)
var outputBar = orchestrator.Execute("Bar");
Logger.LogInformation(outputBar);


Logger.LogInformation("------------- START Orchestrator -------------");
Chain = orchestrator.Chain;

// Start with >>> Foo
// IsNotResponsible >> Foo (Not Executes)
// Invokes >> Bar
// IsNotResponsible >> Bar (Not Executes)
// Invokes >> FooBar
// IsResponsible >>>>> FooBar (Executes)
var outputFooBar = orchestrator.Execute("FooBar");
Logger.LogInformation(outputFooBar);
}

private void SetBeforeHandling(IResponsibilityChainActionBeforeHandling<string> orchestrator)
{
// Adding Before Handling Tasks
orchestrator.ActionBeforeHandling = () =>
{
Logger.LogInformation("---- Responsibility Chain ----");
Logger.LogInformation(GetChainDetail());
};

orchestrator.ActionInputBeforeHandling = input =>
{
Logger.LogInformation($"Executing before with input '{input}'.");
MoveToNext();
};
}

private string GetChainDetail()
{
return $"Name({Chain!.Name}).";
}

private void MoveToNext()
{
Chain = Chain?.Next;
}

private static IResponsibilityChainOrchestrator<string, string> GetOrchestrator() =>
new ResponsibilityChainOrchestrator<string, string>();

private ResponsibilityChain<string, string>? Chain { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Responsibilities.Interfaces;

namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Output.Responsibilities;
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.Responsibilities;

internal abstract class AbstractResponsibilityInputOutput : IResponsibility<string, string>
internal abstract class AbstractResponsibility : IResponsibility<string, string>
{
private readonly string name;

internal AbstractResponsibilityInputOutput(string name)
private protected AbstractResponsibility(string name)
{
this.name = name;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Output.Responsibilities;
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.Responsibilities;

internal class ResponsibilityBar : AbstractResponsibilityInputOutput
internal class ResponsibilityBar : AbstractResponsibility
{
internal ResponsibilityBar() : base(nameof(ResponsibilityBar)) { }

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Output.Responsibilities;
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.Responsibilities;

internal class ResponsibilityFoo : AbstractResponsibilityInputOutput
internal class ResponsibilityFoo : AbstractResponsibility
{
internal ResponsibilityFoo() : base(nameof(ResponsibilityFoo)) { }

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.Output.Responsibilities;
namespace GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.Responsibilities;

internal class ResponsibilityFooBar : AbstractResponsibilityInputOutput
internal class ResponsibilityFooBar : AbstractResponsibility
{
internal ResponsibilityFooBar() : base(nameof(ResponsibilityFooBar)) { }

Expand Down

This file was deleted.

2 changes: 1 addition & 1 deletion GofConsoleApp/Program.cs
Original file line number Diff line number Diff line change
@@ -1 +1 @@
new GofConsoleApp.Examples.Behavioral.CommandPattern.CommandPatternExample().Execute();
new GofConsoleApp.Examples.Behavioral.ChainOfResponsibility.InputOutput.ChainOfResponsibilityExample().Execute();
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators.Chains;

namespace GofPattern.Behavioral.ChainOfResponsibilityPattern.Orchestrators;

public class AbstractResponsibilityChainOrchestrator<TResponsibilityChain>
where TResponsibilityChain : AbstractResponsibilityChain<TResponsibilityChain>
{
protected void AppendChain(TResponsibilityChain responsibilityChain)
{
if (Chain is null)
Chain = responsibilityChain;
else
Chain.SetNext(responsibilityChain);
}

public TResponsibilityChain? Chain { get; private set; }
}
Loading