using System.Collections.Generic;
public static void Main()
var actions = GetActions();
var contexts = GetContexts();
foreach(var context in contexts)
foreach(var action in actions)
public static IEnumerable<Action> GetActions()
=> [new Surrender(), new Attack()];
public static IEnumerable<IContext> GetContexts()
var contexts = new List<IContext>();
contexts.Add(new SurrenderContext()
TeamPlaying = new Team($"TeamPlaying {i}"),
TeamOpponent = new Team($"TeamOpponent {i}")
contexts.Add(new AttackContext()
UnitPlaying = new Unit($"UnitPlaying {i}"),
UnitReceiving = new Unit($"UnitReceiving {i}")
public abstract class Action
public abstract void Execute(IContext context);
public class Surrender: Action
public override void Execute(IContext context)
if(context is SurrenderContext sc)
Console.WriteLine("TeamPlaying: {0}", sc.TeamPlaying.Value);
Console.WriteLine("TeamOpponent: {0}", sc.TeamOpponent.Value);
public interface IContext{}
public class Attack: Action
public override void Execute(IContext context)
if(context is AttackContext ac)
Console.WriteLine("UnitPlaying: {0}", ac.UnitPlaying.Value);
Console.WriteLine("UnitReceiving: {0}", ac.UnitReceiving.Value);
public class SurrenderContext:IContext
public Team TeamPlaying {get;set;}
public Team TeamOpponent {get;set;}
public class AttackContext: IContext
public Unit UnitPlaying {get;set;}
public Unit UnitReceiving {get;set;}
public Team(string value){ Value = value; }
public string Value {get;set;}
public Unit(string value){ Value = value; }
public string Value {get;set;}