设计模式的六大原则(3)
设计模式的六大原则还有最后的两个原则,将在这篇文章介绍啦!!
1、接口隔离原则(Interface Segregation Principle)
接口隔离原则的定义:
要求程序员尽量将庞大臃肿的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法
小应学长自己的理解:
就是要为各个类建立它们需要的专用接口,不要去建立一个很庞大的接口供所有依赖它的类去调用。就是多写的接口,每个接口的功能明确
其实接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
- 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离
- 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建
接口隔离原则的优点:
- 将臃肿庞大的接口分解为多个粒度小的接口,提高系统的灵活性和可维护性
- 接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性
- 如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,灵活性降低,无法提供定制服务,给整体项目带来无法预料的风险
- 使用多个专门的接口还能够体现对象的层次,因为可以通过接口的继承,实现对总接口的定义
- 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法,当实现这个接口的时候,被迫设计冗余的代码
接口隔离原则的实现方法:
- 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑
- 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法
- 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情
接口隔离原则的简单实现:
在不遵循这个原则的时候,是一下写法:
Person父类:
public interface Person {
//开车
void drive();
//吃饭
void eat();
//睡觉
void sleep();
//跑步
void run();
}
父亲类(继承Person类):
public class father implements Person{
@Override
public void drive() {
//没有实现这个技能,因为还不会开车
}
@Override
public void eat() {
System.out.println("我是父亲,我会吃饭");
}
@Override
public void sleep() {
System.out.println("我是父亲,我会睡觉");
}
@Override
public void run() {
System.out.println("我是父亲,我会跑步");
}
}
但是我们知道,要实现一个接口,必须重写这个接口内所以方法,但是我们不能保证实现这个接口的方法都能使用到接口内的方法,比如上面代码中的父亲还不会开车。
遵循接口隔离原则的写法:
会开车:
public interface PersonDrive {
//开车
void drive();
}
会吃饭:
public interface PersonEat {
//吃饭
void eat();
}
会睡觉:
public interface PersonSleep {
//睡觉
void sleep();
}
会跑步:
public interface PersonRun {
//跑步
void run();
}
父类(我会吃饭、睡觉、跑步,还不会开车):
public class father implements PersonEat,PersonRun,PersonSleep{
@Override
public void eat() {
System.out.println("我是父亲,我会吃饭");
}
@Override
public void sleep() {
System.out.println("我是父亲,我会睡觉");
}
@Override
public void run() {
System.out.println("我是父亲,我会跑步");
}
}
就是我不会开车,我就不去实现开车的接口,我会哪些就去实现对应的接口。
这也就是接口隔离原则,符合将庞大臃肿的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法
我们把一个Person接口按照每个方法拆分成多个小接口,这样在日后使用的时候更方便。
2、迪米特法则(Law of Demeter)
以下内容整理自互联网
迪米特法则的定义:
只与你的直接朋友交谈,不跟“陌生人”说话
这句话的意思是:
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的“朋友”是指: 当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法
迪米特法则的优点:
- 降低了类之间的耦合度,提高了模块的相对独立性
- 由于亲合度降低,从而提高了类的可复用率和系统的扩展性
迪米特法则的实现方法:
从迪米特法则的定义和特点可知,强调以下两点:
- 从依赖者的角度来说,只依赖应该依赖的对象
- 从被依赖者的角度说,只暴露应该暴露的方法
运用迪米特法则时要注意以下几点:
- 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标
- 在类的结构设计上,尽量降低类成员的访问权限
- 在类的设计上,优先考虑将一个类设置成不变类
- 在对其他类的引用上,将引用其他对象的次数降到最低
- 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)
- 谨慎使用序列化(Serializable)功能
设计模式的六大原则的总结:
小应学长用了三篇文章介绍了六大原则,文章内有些内容也是来源于互联网,我们只有了解了每个原则的内容,这样才会在实际开发中更好的去遵循这些原则,关于如何更好的使用这些原则,这就得看个人经验啦!!
只有合理的运用各个法则,结合每个原则的优缺点,这样才会让一个程序更规范。
疯狂预告:
小应学长接下去将更新数据库的知识啦,先一起学习数据库的知识,然后和Java连接一起使用!!
大家一起期待吧!!