6大设计原则

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,尽量降低一个类的访问权,尽量降低成员的访问权限。


你可能感兴趣的:(6大设计原则)