装饰者模式:动态地将责任添加到对象上,若要拓展对象,装饰者提供比继承更加有弹性的方案。
和上一篇文章一样,继续对第一篇所写的代码进行修改。
要添加责任的对象:
abstract class Character
{
public AttactBehavior At;//接口变量
private string name;
public string Name
{
get
{
return name;
}
set
{
this.name = value;
}
}
abstract public void fight();
public void setfightmethod(AttactBehavior At)
{
this.At = At;
}
}
internal class Soldier : Character
{
public Soldier()
{
this.Name = "Solder";
}
override public void fight()
{
if (At != null)
{
At.attact();
}
}
}
internal class King : Character
{
public King()
{
this.Name = "King";
}
override public void fight()
{
if (At != null)
{
At.attact();
}
}
ArrayList al = new ArrayList();
public void Registercharacter(Character addcharacter)
{
if (!al.Contains(addcharacter))
{
al.Add(addcharacter);
}
}
public void Removecharacter(Character removecharacter)
{
if (al.Contains(removecharacter))
{
al.Remove(removecharacter);
}
}
public void Notifycharacter()
{
foreach (Character ch in al)
{
ch.fight();
}
}
}
装饰者:
internal class Blood : Character
{
Character a;
public Blood(Character cha)
{
this.a = cha;
this.Name = cha.Name;
this.At = cha.At;
}
override public void fight()
{
a.fight();
Console.WriteLine("Blood!");
}
}
internal class Crazy : Character
{
Character a;
public Crazy(Character cha)
{
this.a = cha;
this.Name = cha.Name;
this.At = cha.At;
}
override public void fight()
{
a.fight();
Console.WriteLine("Crazy!");
}
}
测试程序:
class Program
{
static void Main(string[] args)
{
King K= new King();
K.setfightmethod(new AttactWithKnife());
Console.WriteLine(K.Name);
Character a = new Soldier();
a.setfightmethod(new AttactWithBox());
a = new Blood(a);
Console.WriteLine(a.Name);
Character b = new Soldier();
b.setfightmethod(new AttactWithBox());
b = new Crazy(b);
Console.WriteLine(b.Name);
Console.WriteLine("FirstTime");
K.Registercharacter(a);
K.Registercharacter(b);
K.Registercharacter(K);
K.Notifycharacter();
Console.WriteLine("SecondTime");
K.Removecharacter(a);
K.Notifycharacter();
Console.ReadLine();
}
}