public static void Main()
DamageGiver dg = new BasePlayerDamage();
Console.WriteLine(dg.getDamageDescription());
Console.WriteLine(dg.getDamage());
DamageGiver dg2 = new BasePlayerDamage();
Console.WriteLine(dg2.getDamageDescription());
Console.WriteLine(dg2.getDamage());
DamageGiver dg3 = new BasePlayerDamage();
Console.WriteLine(dg3.getDamageDescription());
Console.WriteLine(dg3.getDamage());
DamageGiver dg4 = new BasePlayerDamage();
Console.WriteLine(dg4.getDamageDescription());
Console.WriteLine(dg4.getDamage());
public abstract class DamageGiver
public int Damage {get; set;}
public string DamageDescription { get; set; }
public abstract int getDamage();
public abstract string getDamageDescription();
public abstract class DamageModifierDecorator : DamageGiver
public override abstract int getDamage();
public override abstract string getDamageDescription();
public class BasePlayerDamage : DamageGiver
public BasePlayerDamage()
DamageDescription = "Fists";
public override int getDamage()
public override string getDamageDescription()
return this.DamageDescription + " for " + this.Damage + " damage";
public class Sword : DamageModifierDecorator
public Sword(DamageGiver dm)
DamageDescription = "Sword";
public override int getDamage()
return damageGiver.getDamage() + this.Damage;
public override string getDamageDescription()
return damageGiver.getDamageDescription() + ", " + this.DamageDescription + " for " + this.Damage + " damage";
public class Ring : DamageModifierDecorator
public Ring(DamageGiver dm)
DamageDescription = "Ring";
public override int getDamage()
return damageGiver.getDamage() + this.Damage;
public override string getDamageDescription()
return damageGiver.getDamageDescription() + ", " + this.DamageDescription + " for " + this.Damage + " damage";
public class Amulet : DamageModifierDecorator
public Amulet(DamageGiver dm)
DamageDescription = "Amulet";
public override int getDamage()
return damageGiver.getDamage() + this.Damage;
public override string getDamageDescription()
return damageGiver.getDamageDescription() + ", " + this.DamageDescription + " for " + this.Damage + " damage";