我可以通过更改属性Name的输出来装饰抽象类Player。例如我的班级是:
public abstract class Player
{
private FootBall ball;
private string name;
public Player(FootBall ball, string name)
{
this.name = name;
this.ball = ball;
}
public string Name
{
get
{
return this.name;
}
}
public virtual void Update()
{
Console.WriteLine(string.Format("Player {0} says that ball is at position {1} {2} {3}", this.Name, this.ball.Position.PositionX, this.ball.Position.PositionY, this.ball.Position.PositionZ));
}
}
我有两个类GamePlayer和Referee都继承了Player:
GamePlayer : Player { // implementation }
Referee: Player { // implementation }
我想用例如两个装饰来装饰属性Name: SoccerPlayer和BasketBallPlayer。属性Name应该返回例如
John - basketballPlayer
John - soccerPlayer:
John - basketballPlayer - soccerPlayer
答案 0 :(得分:3)
装饰器模式最适合接口。如果要将它与抽象基类一起使用,则需要创建任何想要装饰virtual
的方法,以便派生类可以在委托给装饰基类{{1}之前覆盖它们以进行自己的处理。 }} 方法。
此时您基本上使用的是继承。装饰基类和继承之间的唯一区别是,在装饰器模式中,派生类与基类具有base.MyMethod
和Is A
关系,而继承只有{{1}关系。它可能与派生类之外没有区别,所以不妨继承。