2009-05-21 3 views
0

У меня есть два существенно разных приложения для конфигурирования двух аппаратных средств, продаваемых этой компанией.При наличии более одного «приложения», доступного в одной базовой форме

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

Это не особенно сложно для большинства аспектов приложения, но моя проблема связана главным образом с основной панелью инструментов для консолидированного приложения. Каждое из двух разных приложений имеет собственный набор функций, связанных с общим набором кнопок, а также с собственным набором кнопок.

Я мог бы отделить ответы кнопки в коде с проверкой типов, т.е.

If documentOpened.isSpreadsheet 
    spreadSheetFunction() 
Else 
    documentFunction() 

, но это, кажется, грязное мне, включающими функциями двух классов в один класс раздутого интерфейса.

Есть ли какой-то способ достичь большей степени инкапсуляции, здесь, учитывая, что два интерфейса настолько различны?

ответ

1

Дело в том, что шаблон дизайна посетителя (хотя он, вероятно, неприменим в строгом смысле слова). Если вы определили интерфейс, который воплотил все кнопки на панели инструментов, а затем реализовал класс для каждого типа документа, который будет работать нормально, как предлагает Даниэль. Структура кода будет

public interface IToolbarHandler { 
    void ButtonOne; 
    void ButtonTwo; 
    //etc 
} 

public class SpreadsheetToolbarHandler : IToolbarHandler { 
    public void ButtonOne { 
     //Do Some action 
    } 
    public void ButtonTwo { 
     //Do Some action 
    } 
} 

public class DocumentToolbarHandler : IToolbarHandler { 
    public void ButtonOne { 
     //Do Some action 
    } 
    public void ButtonTwo { 
     //Do Some action 
    } 
} 

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

+0

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

1

Я не знаю .Net, так что это общий объектно-ориентированный совет по программированию. Однако, похоже, вы задаете общий вопрос дизайна OO.

Похоже, вы пытаетесь сделать double dispatch; то есть выбрать фактический код, который будет выполняться на основе типа времени выполнения двух разных вещей.

Традиционный чистый способ OO для двойной отправки с visitor pattern. Не обманывайте себя именем или примерами, описывающими шаблон, чтобы проложить какой-то содержащий strucutre; это также очень полезно, даже если у вас есть только один объект за раз!

В принципе, что бы вы сделали, это определить какой-то интерфейс - CommonButtonHandler, а затем реализовать как для таблиц, так и для документов. Когда общая кнопка «вертеть» нажата, вы делаете:

// Inside CommonTwiddleButton.onClick() 
currentCommonButtonHandler.twiddleButtonClicked() 

Есть некоторые хорошие примеры онлайн использование шаблона посетителя для двойной отправки; просто убедитесь, что вы ищете оба условия, или вы получите либо кучу примеров шаблонов посетителя, которые предполагают, что вам нужно пройти какую-то разнородную коллекцию или кучу lisp weenies, хвастающихся о том, как их объектная система просто выполняет множественную отправку по умолчанию.

Смежные вопросы