软件设计原则 —— 接口隔离原则和依赖倒置原则

接口隔离原则就是客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。(百度百科概念)。看着可能比较懵逼。简单的说就是应该使用多个接口,而不是一个包含所有方法的接口。举个例子:在单一职责原则和开闭原则里我们分别创建了WeChatMsgHandler和WeChatEventHandler接口。如果我们只创建一个接口:

public interface WeChatMsgHandelr{
    String msgHandelr(WechatMsg wechatMsg);
    String eventHandelr(WechatMsg wechatMsg);
}

我们在处理事件消息的时候可以用到eventHandelr方法,但是我们处理文本消息,图片消息时 eventHandelr方法明显是多余的,并没有用到该方法。因此我们使用两个接口分别处理:

public interface WeChatMsgHandelr{
    String msgHandelr(WechatMsg wechatMsg);
}
public interface WeChatEventHandelr{
    String eventHandelr(WechatMsg wechatMsg);
}

接口隔离原则符合我们常说的高内聚低耦合的设计思想,可以使类具有很好的可读性,可扩展性和可维护性。我们在设计接口的时候要多花时间去思考,考虑业务模型,包括有可能发生变更的地方。

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。(恩,也是百度百科说的)。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序所造成的风险。还是以处理微信消息为例子,创建一个微信消息处理类:

public class WeChatMsgService{
    public String textMsgHandler() {
        //TODO
    }
    public String ImageMsgHandler() {
        //TODO
    }
}

如果我们想要新增语音和视频消息处理,那么就需要在原类中添加处理语音消息和视频消息的方法,因为业务扩展,要从底层到高层(调用层)依次修改代码。如此以来,系统发布之后,实际上是不稳定的,再修改代码的同时也会带来意想不到的风险。接下来我们优化代码,创建一个抽象WeChatMsgHandler的接口,接口最上面的例子,然后再编写消息处理类:

public class TextMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}
public class VoiceMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}
public class ImageMsgHandler implements WeChatMsgHandler {
    @Override
    public String MsgHandler(WxMpXmlMessage weChatMsg) {
        //TODO
    }
}

这个时候无论想新增处理什么样的消息,都无需修改底层代码,只需要新增一个类即可。再结合依赖注入方式,完全不需要修改调用者部分代码。

你可能感兴趣的:(软件设计原则与模式,设计模式,java,编程语言)