读书人

一个父子关系的接口设计,该怎么解决

发布时间: 2012-01-22 22:38:43 作者: rapoo

一个父子关系的接口设计
有两个接口: 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;
----}
}

仅供参考

读书人网 >J2SE开发

热点推荐