2012-02-12 3 views
0

나는 내 대학과 비슷한 재미있는 일을하고있다. 예를 들어 ClassA가 있습니다. 나는 일요일에 클라이언트가 ClassA 객체를 만들거나 기존 ClassA 객체를 사용할 수없는 객체에 대한 액세스를 제한해야합니다. ClassA의 각 메소드에서 조건을 검사해야하기 때문에 클래스 래퍼를 만들어야한다고 생각합니다. 거기에 어떤 패턴이 있습니까? 제발, 당신이 나를 도울 수 있기를 바랍니다.개체에 대한 액세스를 제한하는 방법은 무엇입니까?

+1

* "내 대학과 비슷한 재미있는 일이 있습니다."* 1) "재미"라는 이상한 아이디어가 있습니다. 2) 과제 질문에 [tag : 숙제] 태그를 추가하는 것을 잊지 마십시오. –

+0

죄송합니다, 감사합니다. – user1166635

답변

5

공장 패턴이 당신이 찾고있는 것입니다. 인수를 팩토리 클래스 ("래퍼")에 전달하면 올바른 종류의 객체를 생성 할 수 있습니다. 예를 들면 : 당신은 기존의를 ClassA가 너무 개체를 사용할 수있는 클라이언트를 원하기 때문에

MyFactory factory = new MyFactory(); 
MyInterface object = factory.create(dayOfTheWeek); 
... 
+0

좋아요, ClassA의 객체를 만드는 것이 좋습니다. 그러나 오늘 일요일이면 모든 기존 객체가 작동하지 않습니다. 즉, 클라이언트가 obj.add(), obj.remove() 등을 실행할 수 없습니다. – user1166635

+0

"작동하지 않음"이란 무엇을 의미합니까? 아무것도하지 마세요? 예외를 던지시겠습니까? ClassB를 구현해 무조건 모든 호출에서'IllegalStateException'을 throw 할 수 있습니다. 또는 ClassA에 isAvailable() 메소드를 추가하고 추가 또는 제거를 호출해야 할 때마다 쿼리 할 수 ​​있습니다. 이것은 훨씬 더 좋을 것입니다. –

0

Factory 패턴이 기능을 수행하는 데 도움이됩니다.

+0

Eser Aygün에 대한 제발 내 코멘트를보십시오 – user1166635

2

, 그것은 아마도 일종의 도움이 될 : 새 객체를 필요로 할 때

class ClassA implements MyInterface { ... } 
class ClassB implements MyInterface { ... } 

class MyFactory { 
    public MyInterface create(int dayOfTheWeek) { 
     if (dayOfTheWeek == 0) { 
      return new ClassA(); 
     } else { 
      return new ClassB(); 
     } 
    } 
} 

는 MyFactory는 실제 클래스를 결정한다 동적 프록시 여기서 대략적인 코드는 다음과 같습니다.

public class MasterControl { 
    public static boolean check(Method m){ 
     //do controls on the current day 
     //return true/false accordingly 
    } 

} 



public class ProxyFactory { 
    public static ClassAInterface getListProxy(final ClassA cp){ 
     return (ClassAInterface) Proxy.newProxyInstance(cp.getClass().getClassLoader(), new Class[] {ClassAInterface.class},new InvocationHandler() { 

      @Override 
      public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable { 
        if(MasterControl.check(method,args[0])) 
         return method.invoke(cp, args); 
        else 
         return (ClassAInterface) null; 
      } 
     }); 
    } 
} 
+0

좋아, 나는 저자의 의견을 첫 번째 대답으로 읽었다. 어쩌면 그건 틀린 것이 아닙니다. Sry, 일반 공장에서 시작되었습니다. –

관련 문제