天天看点

设计模式--软件设计六大原则

为了提高软件系统的可维护性和可复用性,增加可扩展性和灵活性。我们一般要在软件设计过程中遵循以下六大设计原则:

  • 开闭原则
  • 里氏代换原则
  • 依赖倒转原则
  • 接口隔离原则
  • 迪米特法则
  • 合成复用原则
1.开闭原则

“对扩展开放,对修改关闭。” 即在程序需要进行功能等扩展的时候,不去修改原有代码。

要实现这样的效果,我们需要使用接口和抽象类。

例如:搜狗输入法的皮肤设计。

搜狗输入法的皮肤可以划分为背景图片、窗口颜色等元素的组合。我们可以手动的修改其皮肤。而这些皮肤具有相同的特点和属性,可以将其定义为一个抽象类AbstractSkin,而每个具体的皮肤是它的子类。这样我们只需要修改子类的属性即可达到更换皮肤的效果,而不需要改变源代码。

设计模式--软件设计六大原则
2.里氏代换原则

“任何基类可以出现的地方,子类一定可以出现。” 即子类可以扩展父类的功能,但不能改变父类原有的功能。

3.依赖倒转原则

“高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。” 简单来说就是不要对实现进行编程,而要对抽象进行编程,可以降低客户与实现模块的耦合度。

例如:实现类A(细节)依赖于实现类(细节)B,根据依赖倒转原则,应当让抽取出实现类B的抽象类C,让实现类A依赖抽象类C。 同时,实现类B应当依赖于抽象类C;而不能倒置。*

4.接口隔离原则

“客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。”

例如:**类A 含有方法method1()、method2();而类B需要使用类A的方法method1()。**此时若让类B直接继承A,则类B获得了method2(),则使它被迫依赖于不使用的的方法,便违反了接口隔离的原则。

设计模式--软件设计六大原则

正确的做法应当是:定义接口A、B; 让上述设计中类A实现A、B接口;类B实现接口A即可。

设计模式--软件设计六大原则
5.迪米特法则

迪米特法则又叫最少知识原则。

“只和你的直接朋友交谈,不跟陌生人说话。”

如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。目的是提高模块间的独立性。

6.合成复用原则

“尽量先使用组合或者聚合等关联关系来实现,其次才考虑继承关系来实现。”

通常类的复用分为继承复用和合成复用。

继承复用:虽然简单易实现,但破坏了类的封装性、父类和子类耦合度高、限制了复用的灵活性。

合成复用:维持类的封装性、对象间耦合度低、复用的灵活性高。