From 27e61ede554de6146609c88b2a45578bfa946606 Mon Sep 17 00:00:00 2001 From: syeffort Date: Tue, 11 Apr 2023 17:38:24 +0900 Subject: [PATCH] state --- DesignPatternGuru/DesignPatternGuru.sln | 7 ++++ DesignPatternGuru/State/Program.cs | 14 ++++++++ DesignPatternGuru/State/State.csproj | 10 ++++++ .../State/States/ConcreteStateA.cs | 23 ++++++++++++ .../State/States/ConcreteStateB.cs | 23 ++++++++++++ DesignPatternGuru/State/States/Context.cs | 35 +++++++++++++++++++ DesignPatternGuru/State/States/State.cs | 22 ++++++++++++ 7 files changed, 134 insertions(+) create mode 100644 DesignPatternGuru/State/Program.cs create mode 100644 DesignPatternGuru/State/State.csproj create mode 100644 DesignPatternGuru/State/States/ConcreteStateA.cs create mode 100644 DesignPatternGuru/State/States/ConcreteStateB.cs create mode 100644 DesignPatternGuru/State/States/Context.cs create mode 100644 DesignPatternGuru/State/States/State.cs diff --git a/DesignPatternGuru/DesignPatternGuru.sln b/DesignPatternGuru/DesignPatternGuru.sln index 8d53d42..333a235 100644 --- a/DesignPatternGuru/DesignPatternGuru.sln +++ b/DesignPatternGuru/DesignPatternGuru.sln @@ -45,6 +45,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memonto", "Memonto\Memonto. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Observer", "Observer\Observer.csproj", "{EB189FAC-7C63-48BB-92D7-3C35A277EA1D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "State", "State\State.csproj", "{BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -123,6 +125,10 @@ Global {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Release|Any CPU.Build.0 = Release|Any CPU + {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -146,6 +152,7 @@ Global {08D296F6-6698-4FCB-B605-318D9381F975} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {A6E39678-6214-4BD2-B616-A3350340E5AB} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {EB189FAC-7C63-48BB-92D7-3C35A277EA1D} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} + {BE9AFB6B-3AD5-4F54-91FF-7829B0FBFBCD} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E5A9C6B-2E8A-466E-B5E0-4379902EFFAC} diff --git a/DesignPatternGuru/State/Program.cs b/DesignPatternGuru/State/Program.cs new file mode 100644 index 0000000..e44b4cd --- /dev/null +++ b/DesignPatternGuru/State/Program.cs @@ -0,0 +1,14 @@ +using State.States; + +namespace State +{ + internal class Program + { + static void Main(string[] args) + { + var context = new Context(new ConcreteStateA()); + context.Request1(); + context.Request2(); + } + } +} \ No newline at end of file diff --git a/DesignPatternGuru/State/State.csproj b/DesignPatternGuru/State/State.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/DesignPatternGuru/State/State.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/DesignPatternGuru/State/States/ConcreteStateA.cs b/DesignPatternGuru/State/States/ConcreteStateA.cs new file mode 100644 index 0000000..394ff46 --- /dev/null +++ b/DesignPatternGuru/State/States/ConcreteStateA.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace State.States +{ + internal class ConcreteStateA : State + { + public override void Handle1() + { + Console.WriteLine("ConcreteStateA handles request1."); + Console.WriteLine("ConcreteStateA wants to change the state of the context."); + _context.TransitionTo(new ConcreteStateB()); + } + + public override void Handle2() + { + throw new NotImplementedException(); + } + } +} diff --git a/DesignPatternGuru/State/States/ConcreteStateB.cs b/DesignPatternGuru/State/States/ConcreteStateB.cs new file mode 100644 index 0000000..69d3e4c --- /dev/null +++ b/DesignPatternGuru/State/States/ConcreteStateB.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace State.States +{ + internal class ConcreteStateB : State + { + public override void Handle1() + { + Console.WriteLine("ConcreteStateB handles request1."); + } + + public override void Handle2() + { + Console.WriteLine("ConcreteStateB handles request2."); + Console.WriteLine("ConcreteStateB wants to change the state of the context."); + _context.TransitionTo(new ConcreteStateA()); + } + } +} diff --git a/DesignPatternGuru/State/States/Context.cs b/DesignPatternGuru/State/States/Context.cs new file mode 100644 index 0000000..3f18b89 --- /dev/null +++ b/DesignPatternGuru/State/States/Context.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace State.States +{ + internal class Context + { + private State _state = null; + + public Context(State state) + { + TransitionTo(state); + } + + public void TransitionTo(State state) + { + Console.WriteLine($"Context: Transition to {state.GetType().Name}"); + _state = state; + _state.SetContext(this); + } + + public void Request1() + { + _state.Handle1(); + } + + public void Request2() + { + _state.Handle2(); + } + } +} diff --git a/DesignPatternGuru/State/States/State.cs b/DesignPatternGuru/State/States/State.cs new file mode 100644 index 0000000..8fe9866 --- /dev/null +++ b/DesignPatternGuru/State/States/State.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace State.States +{ + abstract class State + { + protected Context _context; + + public void SetContext(Context context) + { + _context = context; + } + + public abstract void Handle1(); + + public abstract void Handle2(); + } +}