1:开闭原则OPC
一个软件实体应当对扩展开放,对修改关闭。再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
例子:
车类 里有名字 发动机 发动机应当拿出另写一个类
2:单一职责原则SRP
就一个类而言,应该仅有一个引起它变化的原因,在构造对象时,应将对象的不同职责分离至多个类中,从而确保引起该类变化的原因只有一个。此原则课提高内聚,降低耦合度。
例子:
文档类{
内容();
打印();
}
打印分很多种,文档内容改变和打印方法改变,都会引起文档类的变化。
可用组合:
文档类{
内容();
打印类;
}
打印接口{
打印();
}
细节打印类1 实现 打印接口{
打印(){}
}
细节打印类2 实现 打印接口{
打印(){}
}
3,里氏替换原则LSP
若对每个类S的对象O1,都存在一个类T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P行为功能不变,则S是T的子类。该原则的具体应用体现在继承关系上,在实现继承时,子类必须能替换掉他们的基类。如果软件中使用的事基类的话那么也一定可以使用其子类,但是反过来代换则可以不成立。即两个类不构成继承关系。
例子:
长方形类{
长;
宽;
get set 方法
}
正方形类 继承 长方形类{
// 长宽相等
set get 方法
//破坏了长方形的思想
}
4,依赖倒置原则DIP
高层模块不应该依赖于底层模块,两者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象。在模块编程中要依赖于抽象编程,不要依赖于具体细节编程,即针对接口编程,不要针对具体实现编程。
例子:
ArrayList<String> lista = new Arraylist<String>();
List<String> listb = new List<String>();
如果以后要使用另外一种LIst实现类,则lista这个变量就无法工作啦,而listb还可以正常使用。
5,接口隔离原则ISP
不要强迫客户依赖于他们不需要的方法,应用接口将两者隔离。
在具体的编程过程中一个类对另外一个类的依赖性应当是建立在最小的接口上的,如果客户端只需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。提供接口意味着向客户端作出承诺,过多的承诺会给系统的维护造成不必要的负担。提供接口的另一个意图是安全性,比如一个论坛系统中普通用户就无法获得一个用户的密码,而管理员就可以,这就对两者做了接口的隔离。
例子:
工厂类 实现 生产接口 , 消费接口{
生产(){};
消费(){};
}
接口 生产{
生产();
}
接口 消费{
消费();
}
main 方法{
消费者 啊 = new 工厂类();
啊.消费();//可以
啊.生产();//不可以
生产者 额 = new 工厂类();
额.生产();//可以
额.消费();//不可以
}