我和我的大學有類似的有趣任務。例如,有ClassA。我需要限制訪問對象,如果今天是星期日客戶端不能使ClassA對象或使用現有的ClassA對象。我想我需要爲課堂做一些包裝,否則我需要在ClassA的每個方法中檢查一天的情況。是否有任何設計模式?請,我希望你能幫助我。如何限制訪問對象?
回答
工廠模式是你在找什麼。您將參數傳遞給工廠類(「包裝器」),它負責創建正確類型的對象。例如:
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);
...
OK,它對於製作ClassA的對象很有好處。但是我需要,如果今天是星期日,所有現有的對象都不起作用,即客戶端無法執行obj.add(),obj.remove()等。 – user1166635 2012-02-12 09:14:55
「不工作」是什麼意思?沒做什麼?拋出異常?您可以實現ClassB,以便無條件地在每次調用時拋出一個'IllegalStateException'。或者,只需向ClassA添加一個'isAvailable()'方法,並在需要調用add或remove時隨時查詢它。這會更好。 – 2012-02-12 09:26:02
既然你要不能使用其他現有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;
}
});
}
}
好吧,我讀了作者給第一個回答的評論。也許這不是完全錯誤的。 Sry,它從簡單的工廠開始 – 2012-02-12 09:40:17
*「我和我的大學有類似的有趣的任務。」* 1)你有一個奇怪的'有趣'的想法。 2)不要忘記將[標籤:家庭作業]標籤添加到作業問題。 – 2012-02-12 08:54:13
對不起,謝謝。 – user1166635 2012-02-12 09:06:48