1

方法的目标: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() 这样的方法的最佳/常见做法是什么?

4

2 回答 2

0

来自关于接口隔离原则的维基百科页面

在软件工程领域,接口隔离原则 (ISP) 指出不应强迫任何客户端依赖它不使用的方法。)

就您而言,您的客户确实依赖于getInfo()and delete(); 因此,您应该以包含两者的粒度隔离您的界面。

考虑 ISP 的另一种方式是为每个客户端构建一个接口。有时,同一个接口可供多个客户端使用,但通常一个接口会在它自己和一个客户端之间建立契约。

于 2019-07-27T21:23:47.433 回答
0

如果您需要使用 ISP,您的版本 #4 看起来不错,但您不能使用它来删除对象,

所以这是解决方案

class MyInfo {
    //some fields
}

interface Delete {
    void delete();
}

interface Info {
    MyInfo getInfo();
}

interface Update {
}

interface Target {
    boolean isTarget();
}

interface ClientProgramm extends Delete, Info, Target {

}

class ConcreteA implements ClientProgramm {

    @Override
    public void delete() {

    }

    @Override
    public MyInfo getInfo() {
        return null;
    }

    @Override
    public boolean isTarget() {
        return false;
    }
}

您所有的接口和类都是独立的,您可以将一些必要的逻辑收集到接口ClientProgramm中,为了获得更大的灵活性,您可以拆分ClientProgramm为 2 个不同的接口,例如UpdateObjectDeleteObject

于 2019-08-05T07:22:43.753 回答