七大设计原则的简单解释之接口隔离原则、迪米特原则

375 阅读3分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

一、Interface Segregation Principle接口隔离原则

(一)、接口隔离原则定义

​ 接口隔离原则是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖他不需要的接口。

一个类对一类的依赖应该建立在最小的接口之上

建立单一接口不要建立庞大臃肿的接口

尽量细化接口,接口中的方法尽量少

(二)、接口隔离原则优点

​ (1)、符合高内聚,低耦合

​ (2)、具有很好的可读性、可扩展性和可维护性

(三)、案例代码

1、不满足接口隔离原则的情况

Animal接口:一个动物行为接口,包含吃、飞以及游泳行为

public interface Animal {
    void eat();

    void fly();

    void swim();
}

Bird类实现:

public class Bird implements Animal{
    @Override
    public void eat() {

    }

    @Override
    public void fly() {

    }

    @Override
    public void swim() {

    }
}

Dog类实现:

public class Dog implements Animal{
    @Override
    public void eat() {

    }

    @Override
    public void fly() {

    }

    @Override
    public void swim() {

    }
}

此时可发现,Bird类的swim方法只可空置,同样Dog类的fly方法也只可空置。

2、符合接口隔离原则的情况

EatAnimal接口:动物吃行为

public interface EatAnimal {
    void eat();
}

FlyAnimal接口:动物飞行为

public interface FlyAnimal {
    void fly();
}

SwimAnimal接口:动物游泳行为

public interface SwimAnimal {
    void swim();
}

Dog类只实现EatAnimal和SwimAnimal接口:

public class Dog implements SwimAnimal,EatAnimal{
    @Override
    public void eat() {

    }

    @Override
    public void swim() {

    }
}

二、Law of Demeter 迪米特法则

(一)、迪米特原则定义

​ 迪米特原则是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则。尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。

​ 迪米特原则中的朋友是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

(二)、迪米特原则优点

​ (1)、降低了类之间的耦合度,提高了模块的相对独立性。

​ (2)、由于亲合度降低,从而提高了类的可复用率和系统的扩展性。

(三)、案例代码

1、不符合迪米特原则的情况 ​ 此时A不认识C只认识B,而B认识C。虽然实现了play(),但是不符合迪米特原则 A认识B,但是不认识C;而B认识C。

public class A {
   
    B b = new B();

    public void play() {
        System.out.println("play");
        b.play();
        C c = new C();
        c.play();
    }

    public static void main(String[] args) {
        A a = new A();
        a.play();
    }
}

2、符合迪米特原则的情况 因为A认识B,所以只同B联系

public class A {
    B b = new B();

    public void play() {
        System.out.println("Aplay");
        b.play();
    }

    public static void main(String[] args) {
        A a = new A();
        a.play();
    }
}

因为B认识C,所以通过B来联系C,而不是通过A直接联系C

public class B {
    C c = new C();

    public void play() {
        System.out.println("Bplay");
        c.play();
    }
}