1 单一职责原则 SRP(Single Responsibility Principle)
就一个类而言,应该仅有一个引起它变化的原因。
一个类应该是对一组相关性高的函数、数据的封装。两个完全不一样的功能就不应该放在一个类中。
单一职责原则也适用于方法(方法的功能尽可能单一,颗粒度要细而不是粗)。
例子:分别定义图片加载类ImageLoader与图片缓存类ImageCache,而不是所有代码写到一个类中。
2 开放封闭原则 OCP(Open - Close Principle )
软件中的对象(类、模块、函数)应该对于扩展是开放的,对于修改是封闭的。
软件需求变化时,尽量通过扩展的方式来实现变化,而不是通过修改已有代码来实现。
勃兰特.梅耶在《面向对象软件构造》中提出开闭原则,认为程序一旦开发完成, 程序中的一个类的实现只应该因为错误而被修改,新的或者改变的特性应该通过新建不同的类实现,新建的类可以通过继承的方式重用原类的代码。
例子:图片加载的缓存策略:抽象缓存接口、具体的缓存类(内存缓存、SD卡缓存、双缓存)。通过依赖注入的方式设置ImageLoader使用的缓存策略。
3 里氏替换原则 LSP (the Liskov Substitution Principle)
所有引用基类的地方,必须能透明地使用其子类对象。(LSP依赖于继承、多态这两大特性)
只要父类能出现的地方子类也可以出现,而且替换为子类不会产生任何错误或异常。
系统设计时,定义一个接口或抽象类,然后编写类来实现。调用者使用接口或抽象类,不需要知道具体的实现是父类还是子类。
例子:ImageLoader中设置缓存策略方法使用缓存接口作为形参,调用时传入实参则是内存缓存类、SD卡缓存类、双缓存类中的任一个。
4 依赖倒置原则 DIP(the Dependency Inversion Principle )
模块间的依赖通过抽象(接口或抽象类)发生,实现类之间不发生直接的依赖关系。特点:
高层模块不应该依赖底层模块,两者都应该依赖其抽象;
抽象不应该依赖细节;
细节应该依赖抽象。
例子:ImageLoader依赖抽象的缓存接口,而不是具体的缓存实现类。缓存需求变化时,ImageLoader不用修改;只要扩展新的缓存类,使用时将其注入到ImageLoader即可。
5 接口分离原则 ISP(the Interface Segregation Principle )
客户端不应该依赖它不需要的接口。
类间的依赖建立在最小的接口上,接口隔离原则将庞大臃肿的接口拆分成更小更具体的接口,客户端只需要实现它感兴趣的接口。
建立职责单一的接口,让接口尽量细化。
6 迪米特法则 LoD(Law of Demeter)
也叫最少知识原则,一个对象应该对其他对象有最少的了解。
只与直接的朋友通信,不和陌生人说话。
这样当一个类发生变化时,对另一个类的影响最小。
狭义的迪米特法则:如果两个类不必彼此直接通信,就不应当发生直接的相互作用。其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。
系统中存在大量的中介类,其存在完全是为了传递类之间的相互调用关系,增加了系统的复杂度。
广义的迪米特法则:
谨慎使用Serializable,尽量降低一个类的访问权,尽量降低成员的访问权限。
网友评论