Skip to content

Commit

Permalink
Add Decorator Pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
oveldman committed Jul 8, 2023
1 parent 3702f87 commit 076bbab
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public class Character : ICharacter
{
private readonly string _name;
private readonly IReadOnlyList<string> _magicSpells;

public Character(string name)
{
_name = name;
_magicSpells = new[] { "Light" };
}

public string GetName()
{
return _name;
}

public string GetClass()
{
return string.Empty;
}

public IReadOnlyList<string> GetMagicSpells()
{
return _magicSpells;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public class Cleric : IClassDecorator
{
private readonly ICharacter _character;

private readonly IReadOnlyList<string> _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<string> GetMagicSpells()
{
return _character.GetMagicSpells()
.Concat(_magicSpells)
.ToList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public interface ICharacter
{
string GetName();
string GetClass();
IReadOnlyList<string> GetMagicSpells();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public interface IClassDecorator : ICharacter
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public class Paladin : IClassDecorator
{
private readonly ICharacter _character;

private readonly IReadOnlyList<string> _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<string> GetMagicSpells()
{
return _character.GetMagicSpells()
.Concat(_magicSpells)
.ToList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
namespace MadWorld.Frontend.Application.DesignPatterns.DecoratorPattern;

public class Wizard : IClassDecorator
{
private readonly ICharacter _character;

private readonly IReadOnlyList<string> _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<string> GetMagicSpells()
{
return _character.GetMagicSpells()
.Concat(_magicSpells)
.ToList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
@page "/Learn/DesignPatterns/DecoratorPattern"

@if (_character.IsSome)
{
<div class="row">
<div class="col-4">
<div class="card" style="width: 30rem;">
<div class="card-body">
<h5 class="card-title">@Character.GetName()</h5>
<p class="card-text">Class: @Character.GetClass()</p>
<p class="card-text">Magic Spells: @string.Join(",", Character.GetMagicSpells())</p>
<button class="btn btn-danger" @onclick="() => Reset()">Reset @Character.GetName()</button>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-2">
<button class="btn btn-success" @onclick="AddCleric">Add Cleric</button>
</div>
<div class="col-2">
<button class="btn btn-warning" @onclick="AddPaladin">Add Paladin</button>
</div>
<div class="col-2">
<button class="btn btn-danger" @onclick="AddWizard">Add Wizard</button>
</div>
</div>
}
else
{
<RadzenTemplateForm Data="@_name" Submit="(string name) => CreateCharacter(name)">
<RadzenColumn Size="12" SizeMD="4">
<RadzenLabel Text="Character name" />
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="8">
<RadzenTextBox @bind-Value="_name" class="col-width-100"></RadzenTextBox>
</RadzenColumn>
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="1rem" Class="rz-mt-8 rz-mb-4">
<RadzenButton ButtonType="ButtonType.Submit" Size="ButtonSize.Large" Icon="save" Text="Save" />
</RadzenStack>
</RadzenTemplateForm>
}
Original file line number Diff line number Diff line change
@@ -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<ICharacter> _character = Option<ICharacter>.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<ICharacter>.None;
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
@page "/Learn/DesignPatterns"

<a href="/Learn/DesignPatterns/ObserverPattern" class="btn btn-primary">Observer Patterns</a>
<div class="container">
<div class="row">
<div class="col">
<a href="/Learn/DesignPatterns/ObserverPattern" class="btn btn-primary">Observer Pattern</a>
</div>
<div class="col">
<a href="/Learn/DesignPatterns/DecoratorPattern" class="btn btn-primary">Decorator Pattern</a>
</div>
</div>
</div>

0 comments on commit 076bbab

Please sign in to comment.