美文网首页
设计原则(二)接口隔离

设计原则(二)接口隔离

作者: 六脉神见 | 来源:发表于2018-09-22 22:56 被阅读0次

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

    第一种定义: Clients should not be forced to depend upon interfaces that they don't use.
    客户端不应该依赖它不需用的接口。

    第二种定义:The dependency of one class to another one should depend on the smallest possible interface。类间的依赖关系应该建立在最小的接口上。

    简单来说就是有两种车,普通汽车和电动车,普通汽车加油,电动车充电。
    这个时候如果我们为两种车抽象一个接口ICar.在接口中定义加油和充电两种补给方法.
    如图:


    image.png

    从图中看出,NormalCar其实是不需要charge方法的,但是因为实现了ICar接口,使得NormalCar不得不实现charge方法,即被迫实现了不需要的方法。
    同理,ElectricCar也不需要refuel方法。
    从中可以看出,该设计就是违反ISP的设计。
    我们试着修改成如下UML:


    image.png
    普通车和电动车,各实现自己的接口。这样就不需要被迫实现对自己没用的方法了.
    如果这个时候又来一种混动车,应该怎么处理呢?
    只要分别实现汽油车接口和电动车接口就OK了.
    如图:
    image.png

    代码如下:

    /**
     * 汽油车接口
     * @author saisaimayi
     *
     */
    public interface IGasCar {
    
        public void refuel();
    }
    
    /**
     * 电动车接口
     * @author saisaimayi
     *
     */
    public interface IElectricCar {
    
        public void charge();
    }
    
    /**
     * 普通车
     * @author saisaimayi
     *
     */
    public class NormalCar implements IGasCar {
    
        public void refuel() {
            System.out.println("reruel for normal car...");
            
        }
    
    }
    
     /**
     * 电动车类
     * @author saisaimayi
     *
     */
    public class ElectricCar implements IElectricCar {
    
        public void charge() {
            System.out.println("charge for Electric car...");
            
        }
    
    }
    
    /**
     * 混动车类
     * @author saisaimayi
     *
     */
    public class HybridCar implements IGasCar, IElectricCar {
    
        public void charge() {
            System.out.println("charge for hybrid car...");
    
        }
    
        public void refuel() {
            System.out.println("refuel for hybrid car...");
    
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:设计原则(二)接口隔离

          本文链接:https://www.haomeiwen.com/subject/hizxoftx.html