设计模式之六大原则之——接口隔离原则、迪米特法则详解
1、接口隔离原则(Interface Segregation Principle,ISP)
-
概念
在将接口隔离原则之前,首先要明确“
接口
”的概念,接口分为两种:-
实力接口
在Java中通过
new
关键子来产生一个对象,是对某一类事物所具有的的方法特征的描述,是逻辑上的抽象 -
类接口
在Java中通过
Interface
关键字严格定义的接口,例如java.lang.Runtime就是一个线程接口
接口隔离原则有两种定义:
- 客户端不应该依赖他不需要的接口
- 类间的依赖关系应该建立在最小的接口上
-
-
内容
接口隔离应用的场景,只提供调用者需要的方法,屏蔽掉不需要的方法
示例:
一电子商务系统中有订单这一类,并且在用户门户、外部系统和管理平台中都会使用到,且三个地方用到的方法都不一样,下面通过下面的代码来看看如何解决吧
用户门户应用接口:
public interface OrderForProtal { public String getOrder(); }
外部系统应用接口:
public interface OrderForOtherSys { public void insertOrder(); }
管理平台应用接口:
public interface OrderForAdmin { public String getOrder(); public void insertOrder(); public void updateOrder(); public void deleteOrder(); }
Order类实现上面三个接口:
public class Order implements OrderForAdmin,OrderForOtherSys,OrderForProtal{ //返给Protal public static OrderForProtal getOrderForProtal() { return new Order(); } //返给OtherSystem public static OrderForOtherSys getOrderForOtherSys() { return new Order(); } //返给Admin public static OrderForAdmin getOrderForAdmin() { return new Order(); } @Override public String getOrder() { return "返回订单"; } @Override public void insertOrder() { System.out.println("插入订单"); } @Override public void updateOrder() { System.out.println("更新订单"); } @Override public void deleteOrder() { System.out.println("删除订单"); } }
不难发现,Order类实现了上面三个接口,外界可以通过它拿到所需要的接口
-
总结
- 一个接口只对一个模块或者业务逻辑进行服务
- 只保留业务中需要的public方法
- 尽量修改污染了的接口,如果修改风险较大,可采用适配器模式进行转化处理(后续会更新)
- 接口的设计因情况而异,不能教条照搬
- 在设计接口时,需要精心筹划。设计时应更具经验和尝试来决定接口的粒度,若接口粒度太小,将导致接口数量剧增,增大开发难度,若接口粒度较大,将会降低开发的灵活性,无法提供定制服务,也给项目带来无法预计的风险
2、迪米特法则(Law of Demeter,LoD)
-
概念
迪米特法则又叫最少知识原则(Least Knowledge Principle,LKP),通俗的讲,就是一个对象对其他对象应尽可能少的了解。
它很多种表述方式,最具代表性的是如下几种表述:
- 至于你直接朋友通信
- 不要跟“陌生人”说话
- 每一个软件单位对其他单位都只有最少的了解,这些了解只局限于哪些与本单位密切相关的软件单位
-
内容
接下来将通过示例代码来演示上图的调用关系:
某人:
public class Someone {
public void call(Friend friend){
friend.forward();
}
}
朋友:
public class Friend {
//声明陌生实例,值得注意的是,这里用的是private修饰符
private Stranger stranger = new Stranger();
//调用
public void forward(){
stranger.strangerMethod();
}
public void friendMethod() {
System.out.println("这是朋友自己的方法");
}
}
陌生人:
public class Stranger {
public void strangerMethod(){
System.out.println("这是陌生人的方法");
}
}
不难看出,Someone类和Stranger类并没有直接联系,而是通过Friend类进行间接访问,减少了类之间的关,降低了类之间的耦合
-
总结
- 迪米特法则的核心观念就是类之间的解耦、弱耦合,只有弱耦合了以后,类的复用率才可以提高
- 在设计模式中,对迪米特法则进行应用的设计模式有如下两种:
- 外观模式
- 中介者模式