接口隔离原则引出
接口隔离原则
定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口;
一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现,导致代码冗余;建立功能单一接口,不要建立特别多功能的接口;接口设计不能过大过小,适度接口。
优点:高内聚,低耦合,类具有很好的可读性,可扩展性,可维护性;
降低耦合:平时设计接口时,只暴露客户端需要的方法,客户端不需要的方法,直接隐藏起来;
提高内聚:减少对外交互,使用接口中最少的方法,完成最多的事情;实际开发中,对以后有可能会发生变更的地方做一些预判,抽象出业务模型。
接口隔离原则案例
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 );
}
}