我如何使用立面设计模式

时间:2014-10-16 10:52:52

标签: design-patterns javafx facade

从今天开始,我想更多地了解应用程序的设计/结构。所以我读了一些关于外观模式的东西,对这种模式有一点疑问。 首先,简要介绍一下我的项目:

我的项目 我的项目是多媒体应用程序。一方面有MultimediaApllication,它有不同的视图(例如Musicscreen,Videoscreen ...),另一方面有我的IRController,它允许你控制应用程序。 MultimediaApplication在没有IRController的情况下工作,因为它监听KeyEvents(例如'enter'被按下)。 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;
}
}

这是abstarct 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(),并且外观决定在调用方法时如何操作。

我可以这样实现我的想法吗?或者我应该更好地问一下,我是否理解了外观模式? 谢谢你的帮助:)

1 个答案:

答案 0 :(得分:1)

关于

  

我了解了立面图案吗?

我想 - 是的。众所周知,Facade design pattern为子系统中的一组接口提供统一接口。但在这种情况下,我认为您可以使用它来定义更高级别的实现,使子系统更易于使用。

隐藏实现细节也是Encapsulation的概念。因此,向其他用户提供他们需要知道/使用的东西,并且实际处理留给负责它的人。

因为您还在考虑

  

更改我的IRController

一种可能的解决方案是Proxy design pattern。它允许您为另一个对象(假设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班级设计的案例。