對 Observer進行包裝,遇到一些問題

biqing0427發表於2007-11-20

主程式呼叫處理執行緒,然後執行緒處理完,又要呼叫主程式的方法進行結束,感覺處理執行緒呼叫主程式方法進行,又返回到原程式,感覺有點關聯性太強,不易於模組話,所以想到利用Observer的機制,將兩個關聯起來,這樣處理執行緒就不用呼叫主程式。

[@more@]最近公司有個專案:

主程式呼叫處理執行緒,然後執行緒處理完,又要呼叫主程式的方法進行結束,感覺處理執行緒呼叫主程式方法進行,又返回到原程式,感覺有點關聯性太強,不易於模組話,所以想到利用Observer的機制,將兩個關聯起來,這樣處理執行緒就不用呼叫主程式。

由於程式大體已經完成,所以我不可能去修改處理執行緒的extends關係,所以我想自己包裝一下Observer,具 體程式碼如下:

1. BaseObserver 類:

import java.util.Observer;
import java.util.Observable;
import java.util.List;
import java.util.ArrayList;
import java.lang.reflect.Method;

public class BaseObserver implements Observer {

private String methodName = "";
private Class list = null;

//設定需要激發的類
public void setObserverObject(Class observer) {
if (list == null)
list = observer;
}

//設定需要激發的方法名
public void setObserverMethod(String methodName) {
this.methodName = methodName;
}

public void update(Observable obj, Object arg) {

if (obj instanceof BaseObservable) {
try {
Method method = list.getClass().getDeclaredMethod(methodName);
……………………
……………………

} catch (NoSuchMethodException e) {
} catch (SecurityException e) {
}
}
}


2.BaseObservable 類
import java.util.Observable;
import java.lang.reflect.Method;
import java.lang.NoSuchMethodException;

public class BaseObservable extends Observable {

private Class className = null;
private String methodName = "";
private Class[] parameterTypes ;

//設定被觀察者名 和 方法名
public void setObserveable(Class className, String methodName)
throws NoSuchMethodException, SecurityException{
this.className = className;
this.methodName = methodName;
}


//設定被觀察者名 和 方法名 及 引數
public void setObserveable(Class className, String methodName,Class[] arameterTypes)
throws NoSuchMethodException, SecurityException
{
this.className = className;
this.methodName = methodName;
this.parameterTypes = new Class[parameterTypes.length];

for(int i =0;i this.parameterTypes[i] = parameterTypes[i];
}
}

//被觀察者的觀察方法
public void doNotifyObserver()
throws NoSuchMethodException, SecurityException{
setChanged();
if(parameterTypes==null)
notifyObservers(className.getMethod(methodName));
else
notifyObservers(className.getMethod(methodName,parameterTypes));
}

}

3. Product 類:一般類

public class Product extends Observable {

private String name;
private float price;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public float getPrice() {
return price;
}

public void setPrice(float price) {
this.price = price;
}
}

4. Action 類:一般類
public class Action {

public void doAction(String str){
System.out.println(str);
System.out.println("action");
}
}


以上是所以得類,現在我想處理如下:
當Product 的 getName 被呼叫時,處理 Action 的 doAction 方法:

Product product = new Product();
Action action = new Action();

BaseObservable observable = new BaseObservable();
BaseObserver observer = new BaseObserver();

try{

//設定觀察者
observer.setObserverObject(Action.class);
observer.setObserverMethod("doAction");

//觀察者放入觸發者內
observable.addObserver(observer);

//設定觸發者
observable.setObserveable(Product.class, "getName");

//活動
product.setName("name");
product.getName();

//最後掉用 (不好的地方,感覺要改進)
observable.doNotifyObserver();

}catch(NoSuchMethodException e){
…………
…………
}catch(SecurityException e){
…………
…………
}


以上是我的所有思路,但是在實際中不能執行,不知道怎麼回事,感覺原理上還是有問題,
小弟是初學設計模式,希望大家指正,不慎感激。

歡迎扔雞蛋,丟石頭,>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9879276/viewspace-983064/,如需轉載,請註明出處,否則將追究法律責任。

相關文章