Как выполнить инициализацию свойств сложной объектной модели на основе заданного типа темы? - PullRequest
0 голосов
/ 20 февраля 2012

У меня сложная объектная модель (включающая много наследования / композиции).некоторые из его свойств квалифицируются как часть темы.Учитывая тему, я хочу инициализировать ее различные свойства.

Как мне разработать класс Generic Theme?

Есть ли шаблон проектирования, поддерживающий это?

1 Ответ

1 голос
/ 08 декабря 2012

Тема звучит для меня как набор визуальных свойств, таких как размер шрифта, цвета фона и т. Д. Ваша сложная объектная модель почти звучит как иерархия элементов управления / элементов пользовательского интерфейса, где каждый элемент управления / элемент имеет свойства, которые вы хотите, чтобы класс Theme инициализации.

Вам нужно сделать так, чтобы каждый объект в вашей сложной объектной модели был темным, поэтому мы создаем IThemeable:

interface IThemeable
{
     void UpdateThemeableProperties();
}

Чтобы иметь больше смысла в UpdateThemeableProperties (), давайте реализуем его в одном из ваших сложных объектов.

class AComplexObject implements IThemable
{
     public bool Selected; // a primitive property we want themeble

     public AnotherComplexObject anotherComplexObject; // implements IThemeable

     public List<IThemable> Children;

     // your object may have other themeable and non-themeable properties.

     public AComplexObject()
     {
         Children = new List<IThemable>();
         UpdateThemableProperties();
     }

     public void UpdateThemableProperties()
     {        
         if (App.CurrentTheme != null)
         {
             // take care of your primitive properties first by practice
             object valueFromTheme = App.CurrentTheme.getPropertyValue("AComplexObject,"Selected");
             Selected = (valueFromTheme != null) ? valueFromTheme : false;
             // false would be the default value if the theme didn't provide it.

             // Do the same as above for all primitive properties you want to
             // participate in the theme.

             // Do for each individual complex property
             if(anotherComplexObject != null)
             {
                anotherComplexObject.UpdateThemeableProperties();
             }

             // Do for each of your lists of complex objects:
             for each (IThemable it in Children)
             {
                  it.UpdateThemeableProperties();
             }
         }
     }
}

Приложение будет глобальным статическим классом, а CurrentTheme будет одним из его членов. Мы создаем функцию UpdateThemeableProperties (), потому что она вызывается много раз, даже внутри одного класса.

Внутри UpdateThemeableProperties мы ищем значения текущей темы для реализующей комбинации класса и свойства с помощью функции CurrentTheme.getPropertyValue (className, propertyName), где className и propertyName являются обеими строками. (Да, мы жестко запрограммировали имя класса и имя свойства). Функция возвращает тип Object, хотя фактический тип соответствует типу свойства, которое вы устанавливаете. Кроме того, не забудьте указать значение по умолчанию, если CurrentTheme не указало его.

Обратите внимание, что каждое сложное свойство чего-либо в вашей модели сложного объекта является IThemable. Вот почему мы можем вызывать UpdateThemeableProperties () для всех из них, даже для тех, которые находятся в структуре списка.

Теперь CurrentTheme:

class CurrentTheme
{
    private Dictionary<String,Object> values;

    public CurrentTheme()
    {
         values = new Dictionary<String,Object>();
    }

    public void setPropertyValue(string className, string propertyName, Object value)
    {
         values.add(className + "_" + propertyName, value);
    }

    public Object getPropertyValue(string className, string propertyName)
    {
         if (values.keyExists(className + "_" + propertyName)
         {
             return values[className + "_" + propertyName];
         }
         else
         {
             return null;
         }
    }

}

Обратите внимание, что реализация словаря на вашем языке может отличаться. Возьмите приведенный выше код как псевдокод.

На этапе инициализации вы можете установить тему. На более позднем этапе вы обычно создаете / создаете экземпляр своей сложной модели. Реализация вашей сложной модели, возможно, нашла свое значение из текущей темы, но после ее создания вызовите YourRootMostComplexObject.UpdateThemeableProperties (), чтобы обновить и убедиться, что все дочерние элементы получат свои свойства из текущей темы.

Когда вы меняете темы (например, выбирая другую из выпадающего списка), вам нужно будет снова вызвать YourRootMostComplexObject.UpdateThemeableProperties (), чтобы обновить все.

При добавлении дочернего элемента (например, добавление элемента в список) во время выполнения вызовите child.UpdateThemeableProperties ():

public addChild(SomeComplexObjectThatImplementsIThemeable child)
{
     Children.add(child);
     child.UpdateThemeableProperties();
}

Это был довольно длинный пост. В итоге,

  • Каждый класс в вашей сложной объектной модели, имеющий тему свойства ДОЛЖНЫ реализовывать IThemeable.
  • Не забудьте реализовать функцию UpdateThemeableProperties () каждого класса IThemeable. Прежде чем пытаться получить его значение из текущей темы, вам нужно будет узнать, какие свойства являются тематическими.
  • UpdateThemeableProperties () вызывается в конструкторе класса IThemeable после изменения текущей темы, при добавлении элемента IThemeable в список и при создании экземпляра свойства типа, реализующего IThemeable.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...