Это код, над которым я работал, который вдохновлен Синглтоном и Обозревателем, но на самом деле ни то, ни другое. Это какой-то другой паттерн или просто дурак? Контекст для этого - приложение для Android, где несколько объектов Activity могут быть заинтересованы в объекте, связанном с определенной учетной записью. Он загружает данные, когда регистрируется первая активность, и позволяет отправлять данные, когда больше нет наблюдателей.
Я хотел бы знать, например, ужасно ли использовать переменные и методы класса для управления этими объектами и наблюдателями. Любая обратная связь приветствуется.
Этот вопрос начинался как вопрос о том, когда следует уведомлять Наблюдателя, если объект, для которого он регистрируется, уже существует. Когда я набирал вопрос, я понял, что в чистом Observer наблюдаемая равна , интересная вещь и статические методы не задействованы.
public class MyObserver{
public MyObserver(String id){
MyObservable.addObserver(this, id);
}
public void update(MyObservable myObservable){
... do something with myObservable ...
... maybe based on myObservable.id ...
}
}
public class MyObservable{
/*********************************
* Object management static code *
*********************************/
private static Map<String,Set<MyObserver>> observers;
static{
observers = new Map<String,Set<MyObserver>>();
}
private static Map<String,MyObservable> instances;
static{
instances = new HashMap<String,MyObservable>();
}
private static void addObserver(MyObserver myObserver, String id){
Set<MyObserver> myObservers = observers.get(id);
if(myObservers==null){
myObservers = new Set<MyObserver>();
observers.put(myObservers);
}
myObservers.add(id);
MyObservable instance = instances.get(id);
if(instance!=null){
myObserver.update(instance);
} else {
loadData(id);
}
}
private static void removeObserver(MyObserver myObserver, String id){
Set<MyObserver> myObservers = observers.get(id);
if(myObservers!=null){
myObservers.remove(myObserver);
if(myObservers.isEmpty()){
instances.remove(id);
}
}
}
private static void loadData(String id){
MyObservable myObservable = ... asynchronous code to load myObservable ...
... callback will call MyObservable.set(id, myObservable); ...
}
private static void set(MyObservable myObservable){
String id=myObservable.getId();
instances.put(id, myObservable);
Set<MyObserver> myObservers = observers.get(id);
if(myObservers!=null){
for(MyObserver myObserver:myObservers){
myObserver.update(myObservable);
}
}
}
/**********************************************
* Data Object instance variables and methods *
**********************************************/
public MyObservable(String id){
myId=id;
}
private string myId;
private String myData1;
private String myData2;
private String myData3;
... getters and setters ...
}