关于设计模式

Posted chengsheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于设计模式相关的知识,希望对你有一定的参考价值。

 
六大原则:
1、单一职责原则(Single Responsibility Principle,简称SRP )
  • 核心思想:应该有且仅有一个原因引起类的变更
  • 问题描述:假如有类Class1完成职责T1,T2,当职责T1或T2有变更需要修改时,有可能影响到该类的另外一个职责正常工作。
  • 好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变更引起的风险。
  • 需注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可以度量的,因项目和环境而异。
 
2、里氏替换原则(Liskov Substitution Principle,简称LSP)
  • 核心思想:在使用基类的的地方可以任意使用其子类,能保证子类完美替换基类。
  • 通俗来讲:只要父类能出现的地方子类就能出现。反之,父类则未必能胜任。
  • 好处:增强程序的健壮性,即使增加了子类,原有的子类还可以继续运行。
  • 需注意:如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系 采用依赖、聚合、组合等关系代替继承。
 
3、依赖倒置原则(Dependence Inversion Principle,简称DIP)
  • 核心思想:高层模块不应该依赖底层模块,二者都该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;
  • 说明:高层模块就是调用端,低层模块就是具体实现类。抽象就是指接口或抽象类。细节就是实现类。
  • 通俗来讲:依赖倒置原则的本质就是通过抽象(接口或抽象类)使个各类或模块的实现彼此独立,互不影响,实现模块间的松耦合。
  • 问题描述:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。
  • 解决方案:将类A修改为依赖接口interface,类B和类C各自实现接口interface,类A通过接口interface间接与类B或者类C发生联系,则会大大降低修改类A的几率。
  • 好处:依赖倒置的好处在小型项目中很难体现出来。但在大中型项目中可以减少需求变化引起的工作量。使并行开发更友好。
 
4、接口隔离原则(Interface Segregation Principle,简称ISP)
  • 核心思想:类间的依赖关系应该建立在最小的接口上
  • 通俗来讲:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
  • 问题描述:类A通过接口interface依赖类B,类C通过接口interface依赖类D,如果接口interface对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。
  • 需注意:
  • 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情
  • 为依赖接口的类定制服务。只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
 
5、迪米特法则(Law of Demeter,简称LoD)
  • 核心思想:类间解耦。
  • 通俗来讲: 一个类对自己依赖的类知道的越少越好。自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的。
 
6、开放封闭原则(Open Close Principle,简称OCP)
  • 核心思想:尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来完成变化
  • 通俗来讲: 一个软件产品在生命周期内,都会发生变化,既然变化是一个既定的事实,我们就应该在设计的时候尽量适应这些变化,以提高项目的稳定性和灵活性。
 
一句话概括:单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
 
常用模式:
1.工厂模式
创建接口,工厂类创建实现了接口的各个实体类。
2.抽象工厂模式
创建工厂的工厂。
3.单例模式
单例类自己创建自己的唯一实例。需要线程安全时,要加锁。
4.建造者模式
由多个简单对象构建成复杂的对象
5.适配器模式
让两个没有关联的类一起运行。解决运行系统的问题。
6.桥接模式
将抽象化与实现化解耦
7.组合模式
将对象组合成树形结构表示“部分-整体”的层次结构
8.装饰器模式
动态给对象添加额外的功能
9.代理模式
为想要访问的对象增加一些控制
10.命令模式
将命令封装成一个对象,通过调用者调用接受者执行命令
11.中介者模式
用一个中介对象封装一系列对象交互,中介者使各对象不需要显式地相互引用
12.观察者模式
一对多的依赖关系,当对象状态改变时,所有依赖于它的对象都得到通知并更新
 

以上是关于关于设计模式的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式C语言设计模式 --- 关于工厂模式的总结

关于设计模式

关于设计模式的一些事!

关于设计模式:啥时候应该使用单例?

关于 OOP 和设计模式?

Flux 设计模式 - 关于视图概念的歧义