接口分离设计原则
接口分离设计原则主要是为了解决接口臃肿的缺陷。
接口如果包含不是特定于它的方法就称为污染的或者臃肿的接口。
客户端不应该被强制依赖它们本不需要使用的接口。。
我们以施乐公司开发的一款多功能机器为例。这个超级施乐公司系统可以处理广泛的作业例如 打印、扫描、装订和复印等功能。
它们可以作为像 IMachine 接口一样实现如下所示:
IMachine.java
package org.byron4j.cookbook.designpattern.segregation;
/**
* 施乐公司系统机器接口
*/
public interface IMachine {
/**
* 打印
*/
public void print();
/**
* 装订
*/
public void staple();
/**
* 扫描
*/
public void scan();
/**
* 复印
*/
public void photoCopy();
}
XeroxMachine.java
package org.byron4j.cookbook.designpattern.segregation;
public class XeroxMachine implements IMachine {
@Override
public void print() {
System.out.println("打印任务...");
}
@Override
public void staple() {
System.out.println("装订任务...");
}
@Override
public void scan() {
System.out.println("扫描任务...");
}
@Override
public void photoCopy() {
System.out.println("复印任务...");
}
}
这个超级机器被生产出来了并且工作得很好。现在该公司有了一个新的市场需求,生产一种机器仅仅只要有打印功能即可。
管理部门决定开发一个定制的打印机。现在开发同事想编写一个 Print 类实现 IMachine 接口。
你注意到这个问题了吗?尽管你仅仅需要打印功能,但你却不得不去实现 IMachine 接口。
现在, IMachine 接口不再遵循接口分离原则了,开始变成了 “臃肿”的接口。
为了避免 IMachine 接口成为一个违背分离原则而成为臃肿的接口,我们可以将 IMachine 接口分散成多个特定的接口。
public interface IPrinter {
public void print();
}
public interface IScanner {
public void fax();
}
public interface IStapler {
public void staple();
}
public interface IPhotoCopier {
public void photoCopy();
}
注意事项
如果你正在处理一个遗留的应用程序,存在“臃肿的接口”,你会如何处理呢?
你可以使用 适配器模式 去分离接口。
接口分离原则使实现变得简单,方便调试和继续维护。
接口分离原则很容易理解,在理论上也是比较友好的,但是很难识别不同的接口,往往以接口的增殖而告终。