Абстракция поведенческой логики - есть ли шаблон проектирования? - PullRequest
0 голосов
/ 11 ноября 2009

Мне нужно абстрагировать некоторый поведенческий код и у меня возникла проблема с попыткой ссылки на объекты в классе, который вызывает эти поведения, позвольте мне попытаться объяснить:

Мой "родительский" класс имеет свойство с именем CurrentPage . У меня также есть некоторая поведенческая логика, которая изменяет свойство CurrentPage , в настоящее время это записано в том же классе. Теперь мне нужно повторно использовать это поведение во многих местах, поэтому я хочу инкапсулировать / абстрагировать это в отдельный ... эм ... класс ??

Я чувствую, что, вероятно, существует шаблон проектирования, который удовлетворит мои потребности, но я не могу понять, какой использовать.

Может ли кто-нибудь там помочь ??

Спасибо, Mark

(я использую C #, Silverlight и MVVM. CurrentPage - это свойство уведомления, а не поле, поэтому его нельзя передать как тип ref в подкласс Behavior)

ОБНОВЛЕНИЕ: Пример добавлен в соответствии с запросом:

class MainApp
{
    public static string CurrentPage { get; set; }

    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
        CurrentPage = "Default value";

        Console.WriteLine(CurrentPage);

        DoWork();

        Console.WriteLine(CurrentPage);

        Console.ReadLine();

    }


    private static void DoWork()
    {
        CurrentPage = "A new page";
    }

}

Я пытаюсь извлечь DoWork () в отдельный класс.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Абстрагируйте поведение в свой собственный класс. Тогда делегируйте это. Если бы вам пришлось назвать это, я думаю, это шаблон «стратегии».

Например:

class MainApp
{
    ...

    void DoWork()
    {
        CurrentPage = "A new page";
    }
}

Может закончиться как:

class PageModifier
{
    void ModifyCurrentPage(MainApp instance)
    {
        instance.CurrentPage = "A new page";
    }
}

class MainApp
{
    ...
    PageModifier _mod;

    void DoWork()
    {
        _mod.ModifyCurrentPage(this);
    }
}

Теперь вы можете использовать PageModifier повсеместно, и поведение сохраняется в одном месте.

1 голос
/ 11 ноября 2009

Переместите логику в отдельный класс, предоставьте соответствующие методы и при необходимости вызывайте их из исходного класса. Как правило, сервисные методы принимают в качестве аргумента экземпляр вашего начального класса. Хотя я не думаю, что здесь речь идет непосредственно о шаблонах проектирования, более подробно о принципах проектирования, посмотрите книгу GoF; оно того стоит.

1 голос
/ 11 ноября 2009

Не знаю c #, но похоже, что это может быть подходящим для определения интерфейса. Однако, как правило, это означает, что необходимо исключить фактическую реализацию поведения, которое вы хотите определить.

...