日期:2014-05-20  浏览次数:20680 次

一个父子关系的接口设计
有两个接口:   Parent,   Child.   Parent生产Child后会在内部保持Child的引用,   现在的需求是如何有效在Child中实现Close()方法.

interface   Parent{
Child   getChild(int   id);
}

interface   Child{
//   如何有效地实现这个接口?
void   Close();
}

class   StandardParent{
Map   children;

public   Child   getChild(int   id){
Child   c   =   new   StandardChild();
c.setId(id);
children.add(id,   c);
return   c;
}
}

class   StandardChild{
//   如何有效地实现这个接口,   以删除Child在Parent中的引用?
public   void   Close(){
}
}

------解决方案--------------------
StandardParent里面提供一个getChildren()方法,返回那个MAP,然后用ID就可以取到这个Child,删掉就可以了
------解决方案--------------------
class StandardChild{
private Parent parent;
public StandardChild(Parent parent){
this.parent = parent;
}

pubic void close(){
parent.delete(this.getId());
}
}
------解决方案--------------------
你可以通过observer来实现阿,(mediator也可以)
class StandardParent implements Observer{
public void update(Observable o, Object arg){
//从Map中删除disposed标识为true的child
}
}

class StandardChild implements Observable{
boolean disposed = false;
pubic void close(){
this.disposed = true;
setChanged();

notifyObservers();
}

public boolean isDisposed(){
return disposed;
}
}

------解决方案--------------------
可以考虑用回调,也就是用listener
for example

class StandardChild{ 
private List listeners; 
public StandardChild(){ 



public void addCloseListener(ClostListener l){ 
synchronized (listeners) {
listeners.add(l);
}


pubic void close(){ 
//do your task here

// call back
synchronized (listeners) {
for (CloseListener l : listeners) {
l.onClose(new CloseEvent(this.getId()));
}
}

}

interface CloseListener { 
void onClose(CloseEvent e); 
}

class CloseEvent { 
int id;
....
}

class StandardParent{ 
----Map children; 

----public Child getChild(int id){ 
--------Child c = new Child(); 
--------c.setId(id); 
--------children.add(id, c); 
c.addCloseListener(new CloseListener() {
public void onClose(CloseEvent e) {
//do something here
children.delete(e.getId());
}
});
--------return c; 
----} 


仅供参考