使用Decorator模式与抽象类

时间:2017-03-23 13:31:24

标签: c# .net

我可以通过更改属性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

1 个答案:

答案 0 :(得分:3)

装饰器模式最适合接口。如果要将它与抽象基类一起使用,则需要创建任何想要装饰virtual的方法,以便派生类可以在委托给装饰基类{{1}之前覆盖它们以进行自己的处理。 }} 方法。

此时您基本上使用的是继承。装饰基类和继承之间的唯一区别是,在装饰器模式中,派生类与基类具有base.MyMethodIs A关系,而继承只有{{1}关系。它可能与派生类之外没有区别,所以不妨继承。

https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx