2011-02-25 68 views
2

我有一個類,名爲雪碧:Decorator模式中的裝飾器是否可用於添加其他方法?

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); 
    } 
} 

Inhereting即是侵略者:

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類中添加額外的東西嗎?

回答

2

修飾符修飾實現組件接口的對象。從這個意義上說,你的子類不會修飾「根」對象;他們不彙總界面,但繼承它(Invader < AnimatedSprite < Sprite)。

因此,與此場景匹配的模式不是裝飾器。這是基本的專業化,據我所知...

事情沒有被添加,因爲組件接口的用戶只能看到接口。您只能部分更改裝飾組件的實施。

你能不能使用裝修?我想你可以,例如,添加一個'輝光':

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

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

我知道 - 但我認爲它可能是裝飾者模式的一個很好的候選人。或者是? – TheDude 2011-02-25 20:45:51

+0

謝謝,我想我現在明白了。我擁有的不是Decorator模式,因爲Sprite(imageBatch)本身沒有任何反應。 – TheDude 2011-02-25 21:05:32

相關問題