接口隔离原则

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

接口隔离原则

介绍

客户端不要依赖不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
案例引入

A类,通过接口1依赖B类,C类通过依赖接口1依赖D类,A类只会用到1-3方法,C类只会使用到1,4,5方法。
uml类图


代码实现
  1. public class Segregation1 {
  2.     public static void main(String[] args) {
  3.         A a = new A();
  4.         a.dependency1(new B());
  5.         a.dependency2(new B());
  6.         a.dependency3(new B());
  7.         C c = new C();
  8.         c.dependency1(new D());
  9.         c.dependency4(new D());
  10.         c.dependency5(new D());
  11.     }
  12. }
  13. interface Interface1{
  14.     public void operation1();
  15.     public void operation2();
  16.     public void operation3();
  17.     public void operation4();
  18.     public void operation5();
  19. }
  20. class B implements Interface1{
  21.     @Override
  22.     public void operation1() {
  23.         System.out.println("B 类 operation1");
  24.     }
  25.     @Override
  26.     public void operation2() {
  27.         System.out.println("B 类 operation2");
  28.     }
  29.     @Override
  30.     public void operation3() {
  31.         System.out.println("B 类 operation3");
  32.     }
  33.     @Override
  34.     public void operation4() {
  35.         System.out.println("B 类 operation4");
  36.     }
  37.     @Override
  38.     public void operation5() {
  39.         System.out.println("B 类 operation5");
  40.     }
  41. }
  42. class D implements Interface1{
  43.     @Override
  44.     public void operation1() {
  45.         System.out.println("D 类 operation1");
  46.     }
  47.     @Override
  48.     public void operation2() {
  49.         System.out.println("D 类 operation2");
  50.     }
  51.     @Override
  52.     public void operation3() {
  53.         System.out.println("D 类 operation3");
  54.     }
  55.     @Override
  56.     public void operation4() {
  57.         System.out.println("D 类 operation4");
  58.     }
  59.     @Override
  60.     public void operation5() {
  61.         System.out.println("D 类 operation5");
  62.     }
  63. }
  64. class A{
  65.     public void dependency1(Interface1 i){
  66.         i.operation1();
  67.     }
  68.     public void dependency2(Interface1 i){
  69.         i.operation2();
  70.     }
  71.     public void dependency3(Interface1 i){
  72.         i.operation3();
  73.     }
  74. }
  75. class C{
  76.     public void dependency1(Interface1 i){
  77.         i.operation1();
  78.     }
  79.     public void dependency4(Interface1 i){
  80.         i.operation4();
  81.     }
  82.     public void dependency5(Interface1 i){
  83.         i.operation5();
  84.     }
  85. }
复制代码
案例分析


  • 类A通过接口interface1依赖B,类C通过接口依赖D,因为接口interface1对于A类和C类来说,不是最小的接口,就会导致类B,类D去重写使用不到的方法
  • 将接口interface1拆分成独立的接口,类A和C分别和其依赖的接口建立依赖关系。也就是采用接口隔离原则。
  • 接口interface1出现的方法,也拆分成三个接口 如下图所示
案例改进

uml类图

  1. public class Segregation2 {
  2.     public static void main(String[] args) {
  3.         A a = new A();
  4.         a.dependency1(new B());
  5.         a.dependency2(new B());
  6.         a.dependency3(new B());
  7.         C c = new C();
  8.         c.dependency1(new D());
  9.         c.dependency4(new D());
  10.         c.dependency5(new D());
  11.     }
  12. }
  13. interface Interface1 {
  14.     public void operation1();
  15. }
  16. interface Interface2{
  17.     public void operation2();
  18.     public void operation3();
  19. }
  20. interface Interface3{
  21.     public void operation4();
  22.     public void operation5();
  23. }
  24. class B implements Interface1,Interface2{
  25.     @Override
  26.     public void operation1() {
  27.         System.out.println("B 类 operation1");
  28.     }
  29.     @Override
  30.     public void operation2() {
  31.         System.out.println("B 类 operation2");
  32.     }
  33.     @Override
  34.     public void operation3() {
  35.         System.out.println("B 类 operation3");
  36.     }
  37. }
  38. class D implements Interface1,Interface3 {
  39.     @Override
  40.     public void operation1() {
  41.         System.out.println("D 类 operation1");
  42.     }
  43.     @Override
  44.     public void operation4() {
  45.         System.out.println("D 类 operation4");
  46.     }
  47.     @Override
  48.     public void operation5() {
  49.         System.out.println("D 类 operation5");
  50.     }
  51. }
  52. class A{
  53.     public void dependency1(Interface1 i){
  54.         i.operation1();
  55.     }
  56.     public void dependency2(Interface2 i){
  57.         i.operation2();
  58.     }
  59.     public void dependency3(Interface2 i){
  60.         i.operation3();
  61.     }
  62. }
  63. class C{
  64.     public void dependency1(Interface1 i){
  65.         i.operation1();
  66.     }
  67.     public void dependency4(Interface3 i){
  68.         i.operation4();
  69.     }
  70.     public void dependency5(Interface3 i){
  71.         i.operation5();
  72.     }
  73. }
复制代码
这样设计的uml类图,满足了案例A,B,C,D四类需要,也满足了接口隔离原则。
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表