簡體   English   中英

設計問題:一個班級的兩個角色。 首先是實例創建,另一個是類型

[英]Design Issue: Two roles for a class. First for instances creating and the other for types

考慮這個類圖:

 +--------+     * +------------------+ * afraid-of             +------------+
 | Garden |------>|    Animal        |<------------------------| Baby       |
 +--------+       +------------------+                         +------------+
                        ^
                        |
                 +----------+------+
                 |                 |
          +------+------+   +------+-----+
          | Cat         |   | Wolf       |
          +-------------+   +------------+

Animal有兩個角色:

  1. 他們將在花園里散步(Class Instance)
  2. 寶寶害怕一些動物(類型)

寶寶應該保留什么? 害怕每只動物的一個例子? (聽起來很糟糕的設計)類型名稱? (我總是盡量避免重構)

該如何解決? (我正在使用C#,我最后才提到它,因為我希望這里有一個通用的,無語言的設計模式或想法)

謝謝

如果嬰兒總是害怕同樣的動物,你就不必保留任何東西。 你可以有一個方法:

public bool IsAfraid(Animal animal)
{
    return animal is Wolf;
}

如果嬰兒在不同的地方和時間害怕不同的動物,你應該讓每只動物都有一個屬性AnimalType(flag enum)。 然后寶寶將擁有屬於AnimalType的AfraidOf屬性。 然后,檢查你是否害怕動物很簡單:

bool afraid = this.AfraidOf.HasFlag(animal.AnimalType);

最后,您可能應該為模式中的不同類型的關系(Contains,Inherits,Afraid of)提供不同類型的鏈接到不同的類。

Baby可以列出他/她害怕的動物名單。 我會指定獨立的方法來添加和刪除列表中的動物因為時間過去可以刪除或添加一些動物。 可以直接通過屬性更改動物列表,但我更喜歡這種情況下的特定方法。

public class Animal { }
public class Cat : Animal { }
public class Wolf : Animal { }

public class Baby
{
    public List<Animal> ScaryAnimalsList { get; private set; }

    public Baby()
    {
        ScaryAnimalsList = new List<Animal>();
    }

    public void AddAnimalToScaryList(Animal animal)
    {
        ScaryAnimalsList.Add(animal);
    }

    public void RemoveAnimalFromScaryList(Animal animal)
    {
        if (ScaryAnimalsList.Contains(animal))
            ScaryAnimalsList.Remove(animal);
    }

    public bool IsAffraidOf(Animal animal)
    {
        return ScaryAnimalsList.Contains(animal);
    }
}

這就是如何使用它

class Program
{

    static void Main(string[] args)
    {
        Cat cat = new Cat();
        Wolf wolf = new Wolf();

        var babyJo = new Baby();
        babyJo.AddAnimalToScaryList(wolf);
        babyJo.IsAffraidOf(wolf);   //true
        babyJo.IsAffraidOf(cat);    //false

        var babySam = new Baby();
        babySam.AddAnimalToScaryList(wolf);
        babySam.AddAnimalToScaryList(cat);
        babySam.IsAffraidOf(wolf);   //true
        babySam.IsAffraidOf(cat);    //true

        var babyBob = new Baby();
        babyBob.IsAffraidOf(wolf);   //false
        babyBob.IsAffraidOf(cat);    //false
    }
}

另一種選擇是為動物添加功能。

public class Animal
{
    public virtual bool EatsSmallChildren { get { return false; } }
}

然后你的寶寶可以檢查動物是否可怕,而不是寶寶是否害怕它。

這會給你的動物類增加負擔,並引入一些概念上的耦合,但也非常直觀,易於理解和維護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM