设计模式六大原则之接口隔离原则、迪米特法则详解

设计模式之六大原则之——接口隔离原则、迪米特法则详解

1、接口隔离原则(Interface Segregation Principle,ISP)

  • 概念

    在将接口隔离原则之前,首先要明确“接口”的概念,接口分为两种:

    1. 实力接口

      在Java中通过new关键子来产生一个对象,是对某一类事物所具有的的方法特征的描述,是逻辑上的抽象

    2. 类接口

      在Java中通过Interface关键字严格定义的接口,例如java.lang.Runtime就是一个线程接口

    接口隔离原则有两种定义:

    1. 客户端不应该依赖他不需要的接口
    2. 类间的依赖关系应该建立在最小的接口上
  • 内容

    接口隔离应用的场景,只提供调用者需要的方法,屏蔽掉不需要的方法

    示例:

    一电子商务系统中有订单这一类,并且在用户门户、外部系统和管理平台中都会使用到,且三个地方用到的方法都不一样,下面通过下面的代码来看看如何解决吧

    用户门户应用接口:

    public interface OrderForProtal {
          
          
        public String getOrder();
    }
    

    外部系统应用接口:

    public interface OrderForOtherSys {
          
          
        public void insertOrder();
    }
    

    管理平台应用接口:

    public interface OrderForAdmin {
          
          
        public String getOrder();
        public void insertOrder();
        public void updateOrder();
        public void deleteOrder();
    }
    

    Order类实现上面三个接口:

    public class Order implements OrderForAdmin,OrderForOtherSys,OrderForProtal{
          
          
        //返给Protal
        public static OrderForProtal getOrderForProtal() {
          
          
            return new Order();
        }
        //返给OtherSystem
        public static OrderForOtherSys getOrderForOtherSys() {
          
          
            return new Order();
        }
        //返给Admin
        public static OrderForAdmin getOrderForAdmin() {
          
          
            return new Order();
        }
        @Override
        public String getOrder() {
          
          
            return "返回订单";
        }
        @Override
        public void insertOrder() {
          
          
            System.out.println("插入订单");
        }
        @Override
        public void updateOrder() {
          
          
            System.out.println("更新订单");
        }
        @Override
        public void deleteOrder() {
          
          
            System.out.println("删除订单");
        }
    }
    

    不难发现,Order类通过上面三个接口,可以对不同的用户通过不同的接口进行隔离

  • 总结

    1. 一个接口只对一个模块或者业务逻辑进行服务
    2. 只保留业务中需要的public方法
    3. 尽量修改污染了的接口,如果修改风险较大,可采用适配器模式进行转化处理(后续会更新)
    4. 接口的设计因情况而异,不能教条照搬
    5. 在设计接口时,需要精心筹划。设计时应更具经验和尝试来决定接口的粒度,若接口粒度太小,将导致接口数量剧增,增大开发难度,若接口粒度较大,将会降低开发的灵活性,无法提供定制服务,也给项目带来无法预计的风险

2、迪米特法则(Law of Demeter,LoD)

  • 概念

    迪米特法则又叫最少知识原则(Least Knowledge Principle,LKP),通俗的讲,就是一个对象对其他对象应尽可能少的了解。

    它很多种表述方式,最具代表性的是如下几种表述:

    1. 至于你直接朋友通信
    2. 不要跟“陌生人”说话
    3. 每一个软件单位对其他单位都只有最少的了解,这些了解只局限于哪些与本单位密切相关的软件单位
  • 内容

在这里插入图片描述

接下来将通过示例代码来演示上图的调用关系:

某人:

public class Someone {
    
    
    public void call(Friend friend){
    
    
        friend.forward();
    }
}

朋友:

public class Friend {
    
    
    //声明陌生实例,值得注意的是,这里用的是private修饰符
    private Stranger stranger = new Stranger();

    //调用
    public void forward(){
    
    
        stranger.strangerMethod();
    }

    public void friendMethod() {
    
    
        System.out.println("这是朋友自己的方法");
    }
}

陌生人:

public class Stranger {
    
    
    public void strangerMethod(){
    
    
        System.out.println("这是陌生人的方法");
    }
}

不难看出,Someone类和Stranger类并没有直接联系,而是通过Friend类进行间接访问,减少了类之间的关,降低了类之间的耦合

  • 总结

    1. 迪米特法则的核心观念就是类之间的解耦、弱耦合,只有弱耦合了以后,类的复用率才可以提高
    2. 在设计模式中,对迪米特法则进行应用的设计模式有如下两种:
      • 外观模式
      • 中介者模式

猜你喜欢

转载自blog.csdn.net/weixin_44829930/article/details/109774568