名称:接口隔离原则(Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上。
分析:类UserInfoService通过接口InfoInterface依赖类UserInfoImpl,类OrderInfoService通过接口InfoInterface依赖类OrderInfoImpl,如果接口InfoInterface对于类UserInfoService和类OrderInfoService来说不是最小接口,那么类UserInfoImpl和类OrderInfoImpl必须去实现他们不需要的方法。
解决:将接口InfoInterface拆分成独立的几个接口,类UserInfoService和类OrderInfoService分别与他们需要的接口建立依赖关系,也就是采用接口隔离原则。
示例1:违反接口隔离原则
UML:
代码:
public class InterfaceSegregation {
public static void main(String[] args) {
//用户信息
UserInfoImpl userInfoImpl = new UserInfoImpl();
UserInfoService userInfoService = new UserInfoService();
userInfoService.printUserName(userInfoImpl);
userInfoService.printUserAge(userInfoImpl);
//订单信息
OrderInfoImpl orderInfoImpl = new OrderInfoImpl();
OrderInfoService orderInfoService = new OrderInfoService();
orderInfoService.printOrderId(orderInfoImpl);
orderInfoService.printOrderAmount(orderInfoImpl);
}
}
interface InfoInterface{
void printUserName();
void printUserAge();
void printOrderId();
void printOrderAmount();
}
class UserInfoImpl implements InfoInterface {
@Override
public void printUserName() {
System.out.println("用户信息:姓名张三");
}
@Override
public void printUserAge() {
System.out.println("用户信息:年龄18");
}
@Override
public void printOrderId() {
}
@Override
public void printOrderAmount() {
}
}
class OrderInfoImpl implements InfoInterface {
@Override
public void printUserName() {
}
@Override
public void printUserAge() {
}
@Override
public void printOrderId() {
System.out.println("订单信息:订单唯一ID");
}
@Override
public void printOrderAmount() {
System.out.println("订单信息:订单金额");
}
}
class UserInfoService {
public void printUserName(UserInfoImpl info) {
info.printUserName();
}
public void printUserAge(UserInfoImpl info) {
info.printUserAge();
}
}
class OrderInfoService {
public void printOrderId(OrderInfoImpl info) {
info.printOrderId();
}
public void printOrderAmount(OrderInfoImpl info) {
info.printOrderAmount();
}
}
示例2:遵守接口隔离原则
UML:
代码:
public class InterfaceSegregation2 {
public static void main(String[] args) {
//用户信息
UserInfoImpl userInfoImpl = new UserInfoImpl();
UserInfoService userInfoService = new UserInfoService();
userInfoService.printUserName(userInfoImpl);
userInfoService.printUserAge(userInfoImpl);
//订单信息
OrderInfoImpl orderInfoImpl = new OrderInfoImpl();
OrderInfoService orderInfoService = new OrderInfoService();
orderInfoService.printOrderId(orderInfoImpl);
orderInfoService.printOrderAmount(orderInfoImpl);
}
}
interface UserInfoInterface{
void printUserName();
void printUserAge();
}
interface OrderInfoInterface{
void printOrderId();
void printOrderAmount();
}
class UserInfoImpl implements UserInfoInterface {
@Override
public void printUserName() {
System.out.println("用户信息:姓名张三");
}
@Override
public void printUserAge() {
System.out.println("用户信息:年龄18");
}
}
class OrderInfoImpl implements OrderInfoInterface {
@Override
public void printOrderId() {
System.out.println("订单信息:订单唯一ID");
}
@Override
public void printOrderAmount() {
System.out.println("订单信息:订单金额");
}
}
class UserInfoService {
public void printUserName(UserInfoImpl info) {
info.printUserName();
}
public void printUserAge(UserInfoImpl info) {
info.printUserAge();
}
}
class OrderInfoService {
public void printOrderId(OrderInfoImpl info) {
info.printOrderId();
}
public void printOrderAmount(OrderInfoImpl info) {
info.printOrderAmount();
}
}