【设计模式】软件设计原则——接口隔离&迪米特

接口隔离原则引出

 接口隔离原则

定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口;


一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现,导致代码冗余;

建立功能单一接口,不要建立特别多功能的接口;接口设计不能过大过小,适度接口。

优点:高内聚,低耦合,类具有很好的可读性,可扩展性,可维护性;

降低耦合:平时设计接口时,只暴露客户端需要的方法,客户端不需要的方法,直接隐藏起来;
提高内聚:减少对外交互,使用接口中最少的方法,完成最多的事情;

实际开发中,对以后有可能会发生变更的地方做一些预判,抽象出业务模型。

接口隔离原则案例

public interface Animal{
    void eat();
    void fly();
    void walk();
    void swim();
}
//实现一个鸟类,swim方法是空的,造成代码冗余

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

    @Override
    public void fly() {
    }

    @Override
    public void walk() {
    }

    @Override
    public void swim() {
    }
}

正确做法如下:

public interface IEat {
    void eat();
}
public interface IWalk {
    void walk();
}
public interface ISwim {
    void swim();
}
public interface IFly{
    void fly();
}


//鸟可以飞,走,吃;不能游泳
public class Dog implements IEat,
        IWalk,
        IFly{

    @Override
    public void eat() {

    }

    @Override
    public void fly() {

    }

    @Override
    public void walk() {

    }
}

迪米特原则引出


迪米特原则

定义:一个对象应该对其它对象,保持最少的了解;

尽量降低类之间的耦合;对外部引入的类,越少越好;

优点:降低了类之间的耦合;

代码层面:不要对外公开太多的public方法和变量,多使用private/protected权限;

核心观念:类的解耦,解耦是有一定程度的,尽量做到弱耦合,耦合程度越低,类的复用率才能提高;由于减少了类之间不必要的依赖,从而达到了降低了耦合的目的;

只和朋友交流,不和陌生人说话

朋友:出现在成员变量,方法的输入,输出参数中的类,称为成员朋友类;出现在方法体内部的类,不属于朋友类;也就是说类A,我使用了类A中的方法,或成员,尽量避免导致本类import导入新的类;


迪米特原则案例

老师让班长记录考勤

//老师类
public class Teacher{
    public void checkAttendance(Monitor monitor) {

        List<Student> studentList= new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            studentList.add(new Student());
        }
        monitor.checkAttendance(studentList);

    }
}
//班长类
public class Monitor{
    public void checkStudentAttendance(List<Student> studentList) {
        System.out.println("今天有" + studentList.size()+"学生到教室");
    }
}
public class Student{
//学生类
}

public class Main {
    public static void main(String[] args) {
        Teacher teacher= new Teacher();
        Monitor monitor= new Monitor();
        teacher.checkAttendance(monitor);
    }
}
//遵循迪米特原则
//Teacher直接给Monitor下指令 , Monitor去查考勤

//老师类
public class Teacher{
    public void checAttendance(Monitor monitor) {
        monitor.checkAttendance();

    }
}
//班长类
public class Monitor{
    public void checkStudentAttendance(List<Student> studentList) {
        List<Student> studentList= new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            studentList.add(new Student());
        }
        System.out.println("今天有" + studentList.size()+"学生到教室");
    }
}
public class Student{
//学生类
}
public class Main {
    public static void main(String[] args) {
        Teacher teacher= new Teacher ();
        Monitor monitor = new Monitor();
        teacher.checAttendance(monitor );
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值