我有一个名为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类中添加其他东西吗?
答案 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 ); //
}
}