如果一个类承担的职责过多,就等于把职责耦合在一起,
一个职责的变化会影响这个类完成其他职责的能力。
这种耦合会导致脆弱的设计,导致发生变化时,设计会遭到意想不到的破坏。
栗子:
我常常会看到有一个类中的一个方法,用于调用数据库获取数据然后再进行逻辑算法处理再值赋值给界面控件。
这样就会造成,当数据库变动的时候,你需要改这个类,当逻辑变动的时候,你也需要改这个类,当界面控件变动的时候,你也需要更改这个类。
由小见大,当我们的项目庞大起来的时候,你就会发现,这个类太“累”了。
所以我们才要分层,分界面、业务逻辑、数据访问层,为的就是达到高内聚、低耦合的效果。
单一职责,就一个类而言,应该仅有一个引起它变化的原因
开放封闭原则(一国两制): 当香港回归的时候,我们国家是社会主义制度,但是香港澳门长期在资本主义制度下发展,
但是强行更改我们的社会主义制度不好,但是也不能强行修改香港澳门的制度,所以使用’一国两制‘。
对于程序而言,就是对于扩展(增加)是开放的,对于修改是封闭的。面对需求我们希望是通过增加代码进行而不是更改现有代码。
依赖倒置原则,高层不应该依赖底层,当底层发生变动的时候,高层只需添加对应的接口方法,底层去实现,不应该出现底层变动,高层跟着变。
依赖倒置原则的核心思想是面向接口编程,我们依旧用一个例子来说明面向接口编程比相对于面向实现编程好在什么地方。
场景是这样的,母亲给孩子讲故事,只要给她一本书,她就可以照着书给孩子讲故事了。代码如下:
class Book{
public String getContent(){
return "很久很久以前有一个阿拉伯的故事……";
}
}
class Mother{
public void narrate(Book book){
System.out.println("妈妈开始讲故事");
System.out.println(book.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
}
}
运行结果:
妈妈开始讲故事
很久很久以前有一个阿拉伯的故事……
运行良好,假如有一天,需求变成这样:不是给书而是给一份报纸,让这位母亲讲一下报纸上的故事,报纸的代码如下:
class Newspaper{
public String getContent(){
return "林书豪38+7领导尼克斯击败湖人……";
}
}
这位母亲却办不到,因为她居然不会读报纸上的故事,这太荒唐了,只是将书换成报纸,居然必须要修改Mother
才能读。
假如以后需求换成杂志呢?换成网页呢?还要不断地修改Mother,这显然不是好的设计。原因就是Mother
与Book
之间的耦合性太高了,必须降低他们之间的耦合度才行。
我们引入一个抽象的接口IReader
。读物,只要是带字的都属于读物:
interface IReader{
public String getContent();
}
Mother
类与接口IReader
发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:
class Newspaper implements IReader {
public String getContent(){
return "林书豪17+9助尼克斯击败老鹰……";
}
}
class Book implements IReader{
public String getContent(){
return "很久很久以前有一个阿拉伯的故事……";
}
}
class Mother{
public void narrate(IReader reader){
System.out.println("妈妈开始讲故事");
System.out.println(reader.getContent());
}
}
public class Client{
public static void main(String[] args){
Mother mother = new Mother();
mother.narrate(new Book());
mother.narrate(new Newspaper());
}
}
运行结果:
妈妈开始讲故事
很久很久以前有一个阿拉伯的故事……
妈妈开始讲故事
林书豪17+9助尼克斯击败老鹰……
这样修改后,无论以后怎样扩展Client类,都不需要再修改Mother类了。这只是一个简单的例子,实际情况中,代表高层模块的Mother类将负责完成主要的业务逻辑,
一旦需要对它进行修改,引入错误的风险极大。所以遵循依赖倒置原则可以降低类之间的耦合性,提高系统的稳定性,降低修改程序造成的风险。
里氏代换原则:一个软件的父类一定能替换他的子类,程序的行为不会有变化,也就是子类必须能够替换父类
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
参考设计模式6大原则