1 定义
不应该强迫客户依赖于它们不用的方法。使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
2 如何实现
考虑一个场景:电子商务的系统,有订单这个类,有三个地方会使用到,
- 门户:只有查询方法
- 外部系统:有添加订单的方法、查询方法
- 后台管理:有添加、修改、删除、查询的方法
其设计具体如UML所示:
代码清单:
- OrderForPortal.java
- OrderForOtherSys.java
- OrderForAdmin.java
- Order.java
- IspDemo.java
1 OrderForPortal.java
public interface OrderForPortal {
String getOrder();
}
2 OrderForOtherSys.java
public interface OrderForOtherSys {
String insertOrder();
String getOrder();
}
3 OrderForAdmin.java
public interface OrderForAdmin {
String deleteOrder();
String updateOrder();
String insertOrder();
String getOrder();
}
4 Order.java
public class Order implements OrderForPortal, OrderForOtherSys, OrderForAdmin {
/**
* 私有化构造器,防止客户端直接使用new关键字创建订单对象
*/
private Order(){
}
public static OrderForPortal getOrderForPortal(){
return (OrderForPortal) new Order();
}
public static OrderForOtherSys getOrderForOtherSys(){
return (OrderForOtherSys) new Order();
}
public static OrderForAdmin getOrderForAdmin(){
return (OrderForAdmin) new Order();
}
@Override
public String deleteOrder() {
return "删除订单deleteOrder()";
}
@Override
public String updateOrder() {
return "修改订单updateOrder()";
}
@Override
public String insertOrder() {
return "添加订单insertOrder()";
}
@Override
public String getOrder() {
return "获取订单getOrder()";
}
}
5 IspDemo.java
public class IspDemo {
public static void main(String[] args) {
OrderForPortal orderForPortal = Order.getOrderForPortal();
OrderForOtherSys orderForOtherSys = Order.getOrderForOtherSys();
OrderForAdmin orderForAdmin = Order.getOrderForAdmin();
System.out.println("门户调用方法:" + orderForPortal.getOrder());
System.out.println("外部系统调用方法:" + orderForOtherSys.getOrder() + "," + orderForOtherSys.insertOrder());
System.out.println("后台管理调用方法:" + orderForPortal.getOrder()
+ "," + orderForAdmin.insertOrder()
+ "," + orderForAdmin.updateOrder()
+ "," + orderForAdmin.deleteOrder());
}
}
3 结论
胖类(fat class)会导致它们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求该胖类进行一个改动时,会影响到所有其他的客户程序。因此,客户程序应该仅仅依赖于它们实际调用的方法。通过把胖类的接口分解为多个特定于客户程序的接口,可以实现这个目标。每个特定于客户程序的接口仅仅声明它的特定客户或者客户组调用的那些函数。接着,该胖类就可以继承所有特定于客户程序的接口,并实现它们。这就解除了客户程序和它们没有调用的方法间的依赖关系,并使客户程序之间互不依赖。