可以使用装饰器模式中的装饰器来添加其他方法吗?

时间:2011-02-25 20:36:22

标签: design-patterns

我有一个名为Sprite的课程:

public abstract class Sprite
{
    protected Texture2D Image { get; set; }
    protected Vector2 position;

    public Sprite(Texture2D image, Vector2 position)
    {
        Image = image;
        this.position = position;
    }

    public void Draw(SpriteBatch imageBatch)
    {
        spriteBatch.Draw(Image, position, Color.White);
    }
}

继承它是AnimatedSprite:

public abstract class AnimatedSprite : Sprite
{
    protected Point SheetSize          { get; set; }
    protected Point CurrentFrame       { get; set; }
    protected Point FrameSize          { get; set; }
    protected int MillisecondsPerFrame { get; set; }
    protected int TimeSinceLastFrame   { get; set; }

    public AnimatedSprite(Point sheetSize, Point currentFrame, Point frameSize,
        int millisecondsPerFrame, int timeSinceLastFrame, Texture2D image, Vector2 position)
        : base(image, position)
    {
        SheetSize    = sheetSize;
        CurrentFrame = currentFrame;
        FrameSize    = frameSize;
        MillisecondsPerFrame = millisecondsPerFrame;
        TimeSinceLastFrame   = timeSinceLastFrame;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(Image, position,
            new Rectangle(CurrentFrame.X * FrameSize.X,
                CurrentFrame.Y * FrameSize.Y,
                FrameSize.X, FrameSize.Y), Color.White);
    }
}

来自是入侵者:

public class Invader : AnimatedSprite
{
    public Invader(Point sheetSize, Point currentFrame, Point frameSize,
        int millisecondsPerFrame, int timeSinceLastFrame, Texture2D image, Vector2 position)
        : base(sheetSize, currentFrame, frameSize, millisecondsPerFrame, timeSinceLastFrame,
        image, position)
    {

    }
}

我认为这将是一个很好的实现装饰模式。问题是,在装饰器模式的大多数示例中,我看到一个来自根抽象类的方法由decorater继承,而没有其他的东西,我有。

我可以在这里使用装饰器模式,我可以在抽象的AnimatedSprite类中添加其他东西吗?

1 个答案:

答案 0 :(得分:2)

装饰器装饰实现Component接口的对象。从这个意义上说,你的子类不会装饰'root'对象;它们不会聚合接口,而是继承它(Invader< AnimatedSprite< Sprite)。

因此匹配此场景的模式不是Decorator。据我所知,它是基本的专业化......

没有添加内容,因为Component接口的 user 只能看到接口。您只能部分更改装饰组件的实现。

你可以使用装饰器吗?我想你可以添加'发光',例如:

public class GlowingSprite : Sprite {
    private Sprite sprite;
    public override void Draw( SpriteBatch imageBatch ) {
       sprite.Draw(imageBatch); 

       // decoration happens vvv
       imageBatch.Overlay( GlowingOval, sprite.position ); //  
    }
}