Можно ли использовать декоратор в Pattern Decorator для добавления дополнительных методов? - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть класс под названием 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)
    {

    }
}

Я думаю, это было бы неплохо для реализации шаблона декоратора. Проблема в том, что в большинстве примеров шаблона декоратора я вижу метод из корневого абстрактного класса, наследуемый декоратором, и никаких дополнительных вещей, которые у меня есть.

Можно ли здесь использовать шаблон декоратора и можно ли добавить дополнительные элементы в абстрактный класс AnimatedSprite?

1 Ответ

2 голосов
/ 25 февраля 2011

Декораторы украшают объекты, которые реализуют интерфейс Компонента.В этом смысле ваши подклассы не украшают «корневые» объекты;они не агрегируют интерфейс, а наследуют его (Invader

Таким образом, шаблон, соответствующий этому сценарию, не является Декоратором.Насколько я могу судить, это базовая специализация ...

Вещи не добавляются, потому что пользователь интерфейса Component видит не больше, чем интерфейс.Вы можете только частично изменить реализацию декорированного компонента.

Не могли бы вы использовать декоратор?Я думаю, вы могли бы добавить «свечение», например:

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

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