开闭原则(核心)
Open Close Principle
理论:对扩展开放,对修改关闭(Open for extension) 实践:尽量使用接口和抽象类(Cloded for modification)《第三回 四海千山皆拱伏 九幽十类尽除名》
玉帝道:“那路神将下界收伏?”言未已,班中闪出太白长庚星俯伏启奏道:“上圣三界中,凡有九窍者,皆可修仙。奈此猴乃天地育成之体,日月孕就之身,他也顶天履地,服露餐霞,今既修成仙道,有降龙伏虎之能,与人何以异哉?臣启陛下,可念生化之慈恩,降一道招安圣旨,把他宣来上界,授他一个大小官职,与他籍名在箓,拘束此间。若受天命,后再升赏;若违天命,就此擒拿。一则不动众劳师,二则收仙有道也。”
玉帝闻言甚喜,道:“依卿所奏。”即着文曲星官修诏,着太白金星招安。
|--“不动众劳师”,是闭;“收仙有道”,是开。
|--给孙悟空一个弼马温的管制,既可以使天庭系统适应新的变化(需求变更),又不改变原有的秩序。
|--在面向对象设计中的体现是:不允许改变抽象层,可以扩展实现层。
里氏代换原则
Liskov Substitution Principle, LSP
理论:父类可以出现的地方,子类一定可以出现
父类替换成子类,程序的行为没有变化,所以父类可以代表任何子类---体现其可重用性实践:以父类名义声明子类对象
Listlist = new ArrayList<>();
《第三回 四海千山皆拱伏 九幽十类尽除名》
悟空执着如意棒,径登森罗殿上,正中间南面坐下。十王即命掌案的判官取出文簿来查。那判官不敢怠慢,便到司房里,捧出五六簿文书并十类簿子,逐一查看。臝虫、毛虫、羽虫、昆虫、鳞介之属,俱无他名。
又看到猴属之类,原来这猴似人相,不入人名;似臝虫,不居国界;似走兽,不伏麒麟管;似飞禽,不受凤凰辖。另有个簿子……悟空拿过簿子,把猴属之类,但有名者一概勾之。
显然,地府掌管生灵,用的是“分门别类”的方法,孙悟空是要销自己“天产石猴”的生死簿,结果销了所有猴类的生死簿,所以“天产石猴”的也销了——父类代表子类。
依赖倒转原则(基础)
Dependence Inversion Principle
理论:抽象不应该依赖细节,细节应该依赖抽象——即对接口编程,而不是对实现编程。
接口隔离原则
Interface Segregation Principle
理论:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
interface 羽 {}interface 飞 {}class 鸵鸟 implements 羽 {}class 麻雀 implements 羽, 飞 {}
迪米特法则(最少知道原则)
Demeter Principle
理论:各模块尽量独立。
《黄飞鸿——狮王争霸》
李大人,所谓胜者为王,败者为寇,刚才天炮一响,如果没有天灯挡枪的话,胜负归谁还真没人知道。现在金牌在我黄某的手上,并非我赢了,大人为了大显我民神威而办的这场狮王争霸,死伤这么多人,在世人面前,其实我们都输了。
以小民之见,我们不只要练武强身,以抗外敌,最重要的还是广开民智,智武和一,那才是国富民强之道。区区一个牌子,能否改变国运,还请李大人三思,这金牌留给您作纪念吧。告辞了!
合成复用原则
Composite Reuse Principle
理论:尽量使用合成/聚合的方式,而不是使用继承(继承毕竟有耦合,父类改了子类就要改)。
实践:Service层调用Dao层,有一个Dao对象的变量,而不是继承Dao。class Dao {}class Service /* extends Dao */{ Dao _dao;}