From 076bbab44677954396b0cced6cc94561919689db Mon Sep 17 00:00:00 2001 From: Oscar Veldman Date: Sat, 8 Jul 2023 21:38:11 +0200 Subject: [PATCH] Add Decorator Pattern --- .../DecoratorPattern/Character.cs | 28 +++++++++++++ .../DesignPatterns/DecoratorPattern/Cleric.cs | 31 ++++++++++++++ .../DecoratorPattern/ICharacter.cs | 8 ++++ .../DecoratorPattern/IClassDecorator.cs | 6 +++ .../DecoratorPattern/Paladin.cs | 31 ++++++++++++++ .../DesignPatterns/DecoratorPattern/Wizard.cs | 31 ++++++++++++++ .../DecoratorPattern/DecoratorPattern.razor | 42 +++++++++++++++++++ .../DecoratorPattern.razor.cs | 37 ++++++++++++++++ .../Learn/DesignPatterns/DesignPatterns.razor | 11 ++++- 9 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Character.cs create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Cleric.cs create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/ICharacter.cs create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/IClassDecorator.cs create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Paladin.cs create mode 100644 MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Wizard.cs create mode 100644 MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor create mode 100644 MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor.cs diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Character.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Character.cs new file mode 100644 index 0000000..e20bbc5 --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Character.cs @@ -0,0 +1,28 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public class Character : ICharacter +{ + private readonly string _name; + private readonly IReadOnlyList _magicSpells; + + public Character(string name) + { + _name = name; + _magicSpells = new[] { "Light" }; + } + + public string GetName() + { + return _name; + } + + public string GetClass() + { + return string.Empty; + } + + public IReadOnlyList GetMagicSpells() + { + return _magicSpells; + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Cleric.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Cleric.cs new file mode 100644 index 0000000..9ab8516 --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Cleric.cs @@ -0,0 +1,31 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public class Cleric : IClassDecorator +{ + private readonly ICharacter _character; + + private readonly IReadOnlyList _magicSpells; + + public Cleric(ICharacter character) + { + _character = character; + _magicSpells = new[] { "Bless", "Guiding Bolt" }; + } + + public string GetName() + { + return _character.GetName(); + } + + public string GetClass() + { + return $"Cleric, {_character.GetClass()}"; + } + + public IReadOnlyList GetMagicSpells() + { + return _character.GetMagicSpells() + .Concat(_magicSpells) + .ToList(); + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/ICharacter.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/ICharacter.cs new file mode 100644 index 0000000..c339c05 --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/ICharacter.cs @@ -0,0 +1,8 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public interface ICharacter +{ + string GetName(); + string GetClass(); + IReadOnlyList GetMagicSpells(); +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/IClassDecorator.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/IClassDecorator.cs new file mode 100644 index 0000000..2e49da8 --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/IClassDecorator.cs @@ -0,0 +1,6 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public interface IClassDecorator : ICharacter +{ + +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Paladin.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Paladin.cs new file mode 100644 index 0000000..a3c300c --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Paladin.cs @@ -0,0 +1,31 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public class Paladin : IClassDecorator +{ + private readonly ICharacter _character; + + private readonly IReadOnlyList _magicSpells; + + public Paladin(ICharacter character) + { + _character = character; + _magicSpells = new[] { "Command", "CloudKill" }; + } + + public string GetName() + { + return _character.GetName(); + } + + public string GetClass() + { + return $"Paladin, {_character.GetClass()}"; + } + + public IReadOnlyList GetMagicSpells() + { + return _character.GetMagicSpells() + .Concat(_magicSpells) + .ToList(); + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Wizard.cs b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Wizard.cs new file mode 100644 index 0000000..bbd3fc7 --- /dev/null +++ b/MadWorld/MadWorld.Frontend.Application/DesignPatterns/DecoratorPattern/Wizard.cs @@ -0,0 +1,31 @@ +namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +public class Wizard : IClassDecorator +{ + private readonly ICharacter _character; + + private readonly IReadOnlyList _magicSpells; + + public Wizard(ICharacter character) + { + _character = character; + _magicSpells = new[] { "CounterSpell", "Fireball" }; + } + + public string GetName() + { + return _character.GetName(); + } + + public string GetClass() + { + return $"Wizard, {_character.GetClass()}"; + } + + public IReadOnlyList GetMagicSpells() + { + return _character.GetMagicSpells() + .Concat(_magicSpells) + .ToList(); + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor new file mode 100644 index 0000000..1ac12ac --- /dev/null +++ b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor @@ -0,0 +1,42 @@ +@page "/Learn/DesignPatterns/DecoratorPattern" + +@if (_character.IsSome) +{ +
+
+
+
+
@Character.GetName()
+

Class: @Character.GetClass()

+

Magic Spells: @string.Join(",", Character.GetMagicSpells())

+ +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+} +else +{ + + + + + + + + + + + +} diff --git a/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor.cs b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor.cs new file mode 100644 index 0000000..547460d --- /dev/null +++ b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DecoratorPattern/DecoratorPattern.razor.cs @@ -0,0 +1,37 @@ +using LanguageExt; +using MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern; + +namespace MadWorld.Frontend.UI.Suite.Pages.Learn.DesignPatterns.DecoratorPattern; + +public partial class DecoratorPattern +{ + private Option _character = Option.None; + private ICharacter Character => _character.FirstOrDefault()!; + + private string _name = string.Empty; + + private void CreateCharacter(string name) + { + _character = new Character(name); + } + + private void AddCleric() + { + _character = new Cleric(Character); + } + + private void AddPaladin() + { + _character = new Paladin(Character); + } + + private void AddWizard() + { + _character = new Wizard(Character); + } + + private void Reset() + { + _character = Option.None; + } +} \ No newline at end of file diff --git a/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DesignPatterns.razor b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DesignPatterns.razor index 013acc9..cf32c94 100644 --- a/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DesignPatterns.razor +++ b/MadWorld/MadWorld.Frontend.UI.Suite/Pages/Learn/DesignPatterns/DesignPatterns.razor @@ -1,3 +1,12 @@ @page "/Learn/DesignPatterns" -Observer Patterns \ No newline at end of file + \ No newline at end of file