目录
1. 接口隔离原则
- 接口隔离原则(Interface Segregation Principle)
1.1 案例
- 类图:
- 代码
public class InterfaceSegregationPrincipleOne {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.denpend1(b);
a.denpend2(b);
a.denpend3(b);
C c =new C();
D d = new D();
c.denpend1(d);
c.denpend4(d);
c.denpend5(d);
}
}
interface InterfaceA{
void operation1();
void operation2();
void operation3();
void operation4();
void operation5();
}
class B implements InterfaceA{
@Override
public void operation1() {
System.out.println("B实现operation1");
}
@Override
public void operation2() {
System.out.println("B实现operation2");
}
@Override
public void operation3() {
System.out.println("B实现operation3");
}
@Override
public void operation4() {
System.out.println("B实现operation4");
}
@Override
public void operation5() {
System.out.println("B实现operation5");
}
}
class D implements InterfaceA{
@Override
public void operation1() {
System.out.println("D实现operation1");
}
@Override
public void operation2() {
System.out.println("D实现operation2");
}
@Override
public void operation3() {
System.out.println("D实现operation3");
}
@Override
public void operation4() {
System.out.println("D实现operation4");
}
@Override
public void operation5() {
System.out.println("D实现operation5");
}
}
class A {
public void denpend1(InterfaceA i){
i.operation1();
}
public void denpend2(InterfaceA i){
i.operation2();
}
public void denpend3(InterfaceA i){
i.operation3();
}
}
class C {
public void denpend1(InterfaceA i){
i.operation1();
}
public void denpend4(InterfaceA i){
i.operation4();
}
public void denpend5(InterfaceA i){
i.operation5();
}
}
- 思考:存在的问题:类B、类D因为实现了接口InterfaceA,重写了接口中的所有方法;但是类B没有必要实现operation4、operation5方法(同理:类D中operation2、operation3也是没必要实现的)现象就是:我们实现了接口中一些不必要的方法
1.1.1 改进方案:
- 类图
- 代码
public class InterfaceSegregationPrincipleTwo {
public static void main(String[] args) {
A1 aOne = new A1();
B1 b1 =new B1();
aOne.denpend1(b1);
aOne.denpend2(b1);
aOne.denpend3(b1);
C1 c1 =new C1();
D1 d1 =new D1();
c1.denpend1(d1);
c1.denpend4(d1);
c1.denpend5(d1);
}
}
interface InterfaceA1 {
void operation1();
}
interface InterfaceA2 {
void operation2();
void operation3();
}
interface InterfaceA3 {
void operation4();
void operation5();
}
class B1 implements InterfaceA1, InterfaceA2 {
@Override
public void operation1() {
System.out.println("B实现operation1");
}
@Override
public void operation2() {
System.out.println("B实现operation2");
}
@Override
public void operation3() {
System.out.println("B实现operation3");
}
}
class D1 implements InterfaceA1, InterfaceA3 {
@Override
public void operation1() {
System.out.println("D实现operation1");
}
@Override
public void operation4() {
System.out.println("D实现operation4");
}
@Override
public void operation5() {
System.out.println("D实现operation5");
}
}
class A1 {
public void denpend1(InterfaceA1 i) {
i.operation1();
}
public void denpend2(InterfaceA2 i) {
i.operation2();
}
public void denpend3(InterfaceA2 i) {
i.operation3();
}
}
class C1 {
public void denpend1(InterfaceA1 i) {
i.operation1();
}
public void denpend4(InterfaceA3 i) {
i.operation4();
}
public void denpend5(InterfaceA3 i) {
i.operation5();
}
}
- 总结:
核心思想:拆分接口,隔离接口
1.2 总结
接口隔离原则:
- 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖(如案例,类A通过接口依赖类B、类C通过接口依赖类D)应该建立在最小的接口上
- 保证最小接口(如果不是最小接口,接口对应的实现类就要实现不必要的方法,如类图一中,类B多余实现了operation4、operation5类D多余实现了operation2、operation3)
- 拆分接口(如改进后的接口InterfaceA1 、InterfaceA2、InterfaceA3)