【六大设计原则】接口隔离原则

634 阅读2分钟

六大设计原则

单一职责原则

里氏替换原则

依赖倒置原则

接口隔离原则

迪米特法则

开放封闭原则

定义

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

示例

以搜索优质房源为例

设计一个优质房源的条件

public interface IGoodHouse {

    /**
     * 大面积
     */
    void bigArea();

    /**
     * 好学区
     */
    void goodSchool();

    /**
     * 便利的交通
     */
    void convenientTraffic();
}

优质房源的实现

@Service
public class GoodsHouseImpl implements IGoodHouse {

    @Override
    public void bigArea() {
        System.out.println("面积很大");
    }

    @Override
    public void goodSchool() {
        System.out.println("学区很好");
    }

    @Override
    public void convenientTraffic() {
        System.out.println("交通便利");
    }
}

设计一个房源搜索

public abstract class AbstractSearchHouse {

    protected IGoodHouse goodsHouse;

    public AbstractSearchHouse(IGoodHouse goodsHouse) {
        this.goodsHouse = goodsHouse;
    }

    public abstract void search();
}

房源搜索的实现

public class SearchHouse extends AbstractSearchHouse {

    public SearchHouse(IGoodHouse goodsHouse) {
        super(goodsHouse);
    }

    @Override
    public void search() {
        super.goodsHouse.bigArea();
        super.goodsHouse.goodSchool();
        super.goodsHouse.convenientTraffic();
    }
}

搜索

public class Client {

    public static void main(String[] args) {
        IGoodHouse goodHouse = new GoodsHouseImpl();
        AbstractSearchHouse searchHouse = new SearchHouse(goodHouse);
        searchHouse.search();
    }
}

结果

image.png

这里就存在一个问题,对于不同的人来说,对于优质房源的条件都是不一样的,那么这样的接口自然就无法满足不同的人对于优质房源的搜索。

优化

将优质房源的接口进行拆分

public interface IBigArea {

    /**
     * 大面积
     */
    void bigArea();
}

public interface IGoodSchool {

    /**
     * 好学区
     */
    void goodSchool();
}

public interface IConvenientTraffic {

    /**
     * 便利的交通
     */
    void convenientTraffic();
}

优质房源的实现

@Service
public class GoodHouseImpl implements IBigArea, IGoodSchool, IConvenientTraffic {

    @Override
    public void bigArea() {
        System.out.println("面积很大");
    }

    @Override
    public void goodSchool() {
        System.out.println("学区很好");
    }

    @Override
    public void convenientTraffic() {
        System.out.println("交通便利");
    }
}

设计一个对优质房源搜索

public abstract class AbstractSearchHouse {

    protected IBigArea bigArea;
    protected IGoodSchool goodSchool;
    protected IConvenientTraffic convenientTraffic;

    public AbstractSearchHouse(IBigArea bigArea, IGoodSchool goodSchool, IConvenientTraffic convenientTraffic) {
        this.bigArea = bigArea;
        this.goodSchool = goodSchool;
        this.convenientTraffic = convenientTraffic;
    }

    public abstract void search();
}

房源搜索的实现

顾客根据自己对优质房源的定义进行搜索

public class SearchHouse extends AbstractSearchHouse {

    public SearchHouse(IBigArea bigArea, IGoodSchool goodsHouse, IConvenientTraffic convenientTraffic) {
        super(bigArea, goodsHouse, convenientTraffic);
    }

    @Override
    public void search() {
        super.bigArea.bigArea();
        super.goodSchool.goodSchool();
        super.convenientTraffic.convenientTraffic();
    }
}

搜索

public class Client {

    public static void main(String[] args) {
        IGoodHouse goodHouse = new GoodsHouseImpl();
        AbstractSearchHouse searchHouse = new SearchHouse(goodHouse);
        searchHouse.search();
    }
}

结果

image.png

改造后,实现了用户可以根据自己对优质房源的定义进行搜索。

注意

  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

  • 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。