六大设计原则
定义
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
示例
以搜索优质房源为例
设计一个优质房源的条件
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();
}
}
结果
这里就存在一个问题,对于不同的人来说,对于优质房源的条件都是不一样的,那么这样的接口自然就无法满足不同的人对于优质房源的搜索。
优化
将优质房源的接口进行拆分
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();
}
}
结果
改造后,实现了用户可以根据自己对优质房源的定义进行搜索。
注意
-
接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
-
为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
-
提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。