从今天开始,我想更多地了解应用程序的设计/结构。所以我读了一些关于外观模式的东西,对这种模式有一点疑问。 首先,简要介绍一下我的项目:
我的项目 我的项目是多媒体应用程序。一方面有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(),并且外观决定在调用方法时如何操作。
我可以这样实现我的想法吗?或者我应该更好地问一下,我是否理解了外观模式? 谢谢你的帮助:)
答案 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
班级设计的案例。