方法的目标:ClientProgram::deleteObject() 是删除目标对象。它会在删除对象之前显示对象的详细信息。
//#1. Client program which delete the target object.
public class ClientProgram {
List<AbstractBase>list = new ArrayList<ConcreteA>();
void deleteObject(String key) {
for(AbstractBase obj : list){
if(!obj.isTarget(key))continue;
//show info and delete the object
Msg( obj.getInfo().toString() );
obj.delete();
break;
}
}
}
当具体类从抽象基类(如下#2,#3)或具有多方法的接口扩展时,这是可行的。
//#2. A base abstract class for concrete classes
public abstract class AbstractBase {
public abstract boolean isTarget(String key);
public abstract void delete();
public abstract void update(AbstractBase obj);
public abstract AbstractBase getInfo();
}
//#3. A concrete class with an abstract class
public class ConcreteA extends AbstractBase {
....
}
但是一旦所有的方法都被隔离到四个不同的接口中,如#4(应用了 ISP),您只能使用隔离接口中的任何一个来控制具体对象,并且不能同时调用 getInfo() 和 delete() .
//#4. A concrete class with segregated interfaces
public class ConcreteA implements Delete, Update, GetInfo, Target {
....
}
使用像#4 这样的 ISPed 类创建像 deleteObject() 这样的方法的最佳/常见做法是什么?