2014-10-16 4 views
0

오늘부터는 응용 프로그램 설계/구조화 방법에 대해 자세히 알기를 원합니다. 그래서 저는이 패턴에 대해 약간의 의문이있는 외관 패턴에 관한 것을 읽었습니다. 모두의 첫째, 내 프로젝트에 대한 짧은 소개 :외관 디자인 패턴을 사용하는 방법

내 프로젝트 내 프로젝트는 멀티미디어 응용 프로그램입니다. 한쪽에는 다른보기 (예 : Musicscreen, Videoscreen ...)가있는 MultimediaApllication이 있습니다. 반대쪽에는 응용 프로그램을 제어 할 수있는 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에서 키 클래스입니다. 모든 키가 키를 수반합니다.

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; 
} 

이제 IR 컨트롤러를 변경하면 키의 바이트 코드 만 변경하면됩니다.

문제는 키 클래스와 멀티미디어 응용 프로그램 간의 통신을 알고 있습니다. 모든 것이 느슨하게 결합 되었기 때문에 멀티미디어 응용 프로그램의 외관을 만드는 것이 좋습니다. 따라서 핵심 클래스는 facade의 play() stop() pause()와() 메소드를 호출 할 때 어떻게 행동할지 결정할 수 있습니다.

내 아이디어를 구현할 수 있습니까? 아니면 물어 보는 것이 좋을까요? 외관 패턴을 올바르게 이해해야합니까? 당신의 도움에 대한 감사합니다 :)

답변

1

는 약

내가 바로 외관 패턴을 이해?

나는 생각합니다. Facade design pattern은 서브 시스템의 인터페이스 세트에 통일 된 인터페이스를 제공하는 것으로 알려져 있습니다. 그러나이 경우에는 하위 시스템을보다 쉽게 ​​사용할 수 있도록 상위 수준 구현을 정의하는 데 사용할 수 있다고 생각합니다.

구현 세부 사항을 숨기는 것도 Encapsulation의 개념입니다. 그래서 다른 사용자들은 그들이 알고/사용해야하는 것들을 제공 받고 있으며 실제 처리는 책임있는 사람에게 맡겨져 있습니다.

당신은 또한 내 IRController

하나 개의 가능한 솔루션을

변화를 고려하고 있기 때문에이 Proxy design pattern입니다. 다른 개체 (대리자 : class Key)에 대한 대리 또는 자리 표시자를 제공하여 해당 개체에 대한 액세스를 제어 할 수 있습니다.

UPDATE : 당신은 아파치 코 몬즈 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 클래스 디자인의 케이스에 적용 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다 :)하지만 ... "하위 시스템을보다 쉽게 ​​사용할 수 있도록 상위 수준 구현을 정의하는 데 사용할 수 있다고 생각합니까?" – Chris

+0

업데이트 된 답변보기 – ekostadinov