Как использовать шаблон оформления фасада

С сегодняшнего дня я хочу больше узнать о том, как проектируется/структурируется приложение. Итак, я прочитал кое-что о шаблоне фасада и получил небольшой вопрос об этом шаблоне. Прежде всего, краткое введение в мой проект:

Мой проект Мой проект – мультимедийное приложение. С одной стороны находится MultimediaApplication, у которого есть разные представления (например, Musicscreen, Videoscreen...), а с другой стороны есть мой IRController, который позволяет вам управлять приложением. Приложение MultimediaApplication работает без IRController, потому что оно слушает KeyEvents (например, нажато «ввод»). IRController похож на небольшую собственную систему: IRController

Это перечисление создает ключевой объект, если на ircontroller нажата клавиша.

public enum 

          /*
          Example Values
          */
          VOL_UP(new MediaVolumeUpKey()),
          VOL_DOWN(new MediaVolumeDownKey()),
          MUTE(new MediaMuteKey());


        private byte bytes[];// Repräsentiert den Key
        private Key k;

        private Keys(Key key){
        this.k = key;
        }
 public static Key getKey(byte[] bytes){
for(Keys key: values()){
if(Arrays.equals(key.getBytes(), bytes)){
return key.k;
}
}
return null;
}

public byte[] getBytes(){
return this.bytes;
}

public Key getKey(){
return this.k;
}
}

И это абстрактный класс Key. Все ключи означают ключ.

public abstract class Key {
private byte[] bytes;

protected Key(int...bytes){//int... als argumente für übersichtlichen Code
byte[] temp = new byte[bytes.length];
for(int i =0; i<bytes.length;i++) temp[i] = bytes[i];
this.bytes = temp;
}

public byte[] getBytes(){return bytes;} 

public void abstract call();
}


public static Key getKey(byte[] bytes){
for(Keys key: values()){
if(Arrays.equals(key.getBytes(), bytes)){
return key.k;
}
}
return null;
}

public byte[] getBytes(){
return this.bytes;
}

public Key getKey(){
return this.k;
}

Теперь, когда я меняю свой IRController, мне просто нужно изменить байт-код для ключа.

Проблема заключается в знании связи между ключевыми классами и мультимедийным приложением. Поскольку все слабо связано, я подумал, что может быть хорошей идеей построить фасад вокруг мультимедийного приложения. Таким образом, ключевой класс может вызывать play() stop() pause() volUp() фасада, и фасад решает, как действовать при вызове метода.

Могу ли я реализовать свою идею таким образом? Или мне лучше спросить, правильно ли я понял шаблон фасада? Спасибо за вашу помощь :)


person Chris    schedule 16.10.2014    source источник


Ответы (1)


О

Я правильно понял рисунок фасада?

Я думаю да. Шаблон проектирования "Фасад" более известен тем, что обеспечивает унифицированный интерфейс для набора интерфейсы в подсистеме. Но в этом случае я думаю, вы можете использовать его для определения реализации более высокого уровня, которая упрощает использование подсистемы.

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

Поскольку вы также рассматриваете

изменить мой IRController

Одним из возможных решений является шаблон проектирования прокси. Это позволяет вам предоставить суррогат или заполнитель для другого объекта (допустим, class Key ) для управления доступом к нему.

ОБНОВИТЬ:

Вы можете рассмотреть этот код из Apache Commons StringUtils:

public static String[] splitByCharacterType(final String str) {
    return splitByCharacterType(str, false);
}

private static String[] splitByCharacterType(final String str, final boolean camelCase) {
    // code...
}

Как видите, в SplitByCharacterType(final String str, final boolean camelCase) есть два параметра, но только один доступен для внешнего мира через splitByCharacterType(final String str). Вы можете применить его для своего случая дизайна класса Key.

person ekostadinov    schedule 16.10.2014
comment
Спасибо за ваш ответ :) Но что вы имеете в виду под ... Я думаю, вы можете использовать его для определения реализации более высокого уровня, которая упрощает использование подсистемы? - person Chris; 16.10.2014