2012-02-12 87 views
0

我和我的大學有類似的有趣任務。例如,有ClassA。我需要限制訪問對象,如果今天是星期日客戶端不能使ClassA對象或使用現有的ClassA對象。我想我需要爲課堂做一些包裝,否則我需要在ClassA的每個方法中檢查一天的情況。是否有任何設計模式?請,我希望你能幫助我。如何限制訪問對象?

+1

*「我和我的大學有類似的有趣的任務。」* 1)你有一個奇怪的'有趣'的想法。 2)不要忘記將[標籤:家庭作業]標籤添加到作業問題。 – 2012-02-12 08:54:13

+0

對不起,謝謝。 – user1166635 2012-02-12 09:06:48

回答

5

工廠模式是你在找什麼。您將參數傳遞給工廠類(「包裝器」),它負責創建正確類型的對象。例如:

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決定實際的類:

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

OK,它對於製作ClassA的對象很有好處。但是我需要,如果今天是星期日,所有現有的對象都不起作用,即客戶端無法執行obj.add(),obj.remove()等。 – user1166635 2012-02-12 09:14:55

+0

「不工作」是什麼意思?沒做什麼?拋出異常?您可以實現ClassB,以便無條件地在每次調用時拋出一個'IllegalStateException'。或者,只需向ClassA添加一個'isAvailable()'方法,並在需要調用add或remove時隨時查詢它。這會更好。 – 2012-02-12 09:26:02

0

Factory模式將幫助您實現此功能。

+0

請看我對EserAygün的評論 – user1166635 2012-02-12 09:15:37

2

既然你要不能使用其他現有ClassA的對象了一個客戶端,它可能會幫助一個樣的動態代理。這裏粗略的代碼:

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,它從簡單的工廠開始 – 2012-02-12 09:40:17