2013-02-05 34 views
0

我有一個類動物創造性設計模式

和類繼承自動物。

我想在列表框GUI中向用戶顯示動物圖像(魚和馬),他應該選擇並按OK以創建魚或馬。

(該列表框中的圖像應創建是動態的(例如正從XML圖像)。)

這不是一個GUI的問題:)

你認爲的優先停留設計模式是什麼那?

我以爲用屬性圖像和AnimalTypeEnum創建類AnimalInfo。這將是我選擇的。

但是,如何將它連接到我之後創建的動物。動物類擁有什麼?

謝謝。

+0

請接受的解決方案是否能解決你的問題。 – Eric

回答

0

AnimalInfo接口還應該包含返回一個動物,就像一個工廠方法:

Animal createAnimal(); 

然後調用,當用戶點擊和你有一個動物。它也可以抽象構造函數所需的參數。例如,如果Fish構造函數使用顏色,而Horse不使用,則可以對其進行硬編碼或將其作爲Fish的AnimalInfo實現的標記。

1

我會推薦一個工廠模式。看看this source。但是,我認爲你可能不一定需要一個模式。您顯然正在使用面向對象的語言。我建議你讓Animal成爲一個抽象類,並添加一個方法來創建或獲取圖像。然後在每個子類中實現圖像。在你的代碼中,只需調用任何動物的方法,並調用正確的方法,創建你的圖像。

更新:

我想在我剛纔的答覆擴大。我認爲你應該簡單地使用多態。這個詞逃脫了我,但這是我一直在想的。 This post給出了一些很好的例子,說明如何使用多態性進行你想做的事情。以下是我建議:

public class Animal 
{ 
    String name; 
    Bitmap image; 

    abstract Bitmap getImage(); 
} 

public class Cat extends Animal 
{ 
    public Cat(string name, Bitmap image) 
    { 
     this.name = name; 
     this.image = image; 
    } 

    public Bitmap getImage() 
    { 
     return image; 
    } 
} 


public class Dog extends Animal 
{ 
    public Dog(string name, Bitmap image) 
    { 
     this.name = name; 
     this.image = image; 
    } 

    public Bitmap getImage() 
    { 
     return image; 
    } 
} 

現在,你可以做到以下幾點:

Animal myAnimal = new Cat("Susi", prettyPicture); 
showImage(myAnimal.getImage()); 

其中showImage()是可視化圖像的方法。現在,這個例子看起來很愚蠢,因爲你可以在不使用多態性的情況下直接完成它,而只是按照你的建議存儲一個類型。但想象一下,你想要照片被區別對待。在獲取圖片的每種方法中,您都可以實現不同的行爲。就你所知,一個類不能直接存儲位圖,而是存儲資源的URI。所有對你的GUI都是透明的,因爲它期望一個位圖返回到方法調用。這個原則被稱爲封裝,是OO設計的另一個基石。此外,如果你看過這些例子,你可以想象通過一個簡單的playSound()方法在GUI上爲每隻動物播放聲音,該方法在Animal中再次抽象出來,並由具體的子類實現。

我希望你找到你正在尋找的答案!

+0

非常感謝您的詳細信息。看起來這是我的解決方案。 – user1902346

+0

很高興你發現你在找什麼。根據您的權限,如果回答您的問題,請點擊分數下方的複選標記接受答案。 – Eric

0

您可以使用簡單工廠模式,下面的示例代碼清單:

public interface IAnimial 
    { 
     void DrawImage(); 
    } 
    public class Animial:IAnimial 
    { 
     public void DrawImage() 
     { 
      Console.WriteLine("Image for Animial"); 
     } 
    } 
    public class Hourse:IAnimial 
    { 
     public void DrawImage() 
     { 
      Console.WriteLine("Image for Hourse"); 
     } 
    } 
    public class Fish : IAnimial 
    { 
     public void DrawImage() 
     { 
      Console.WriteLine("Image for Fish"); 
     } 
    } 
    public class CreateAnimial 
    { 
     public static IAnimial Factory(string animialType) 
     { 
      switch (animialType) 
      { 
       case "Hourse": 
        return new Hourse(); 

       case "Fish": 
        return new Fish(); 

       default: 
        return new Animial(); 
      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     IAnimial animial = CreateAnimial.Factory("Hourse"); 
     animial.DrawImage(); 
    }