23种设计模式图解

设计模式作用

   解决同一种类型的问题,使用设计模式可以让代码结构更加清晰。

设计模式一图总览

在这里插入图片描述


C# 设计模式目录

C# 工厂模式

C# 单例模式

C# 观察者模式

C# 代理模式

C# 策略模式

C# 中介模式

C# 外观(门面)模式

C# 组合模式

C# 原型模式

C# 模板方法模式

C# 备忘录模式

C# 迭代器模式

C# 装饰器模式

C# 桥接模式

C# 状态模式

C# 责任链模式

C# 命令模式

C# 享元模式

                             正在持续更新中......

七大设计原则

开闭原则(Open Closed Principle,OCP)

  • 概念:
    一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。
  • 目标:
    当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  • 使用注意事项:
  1. 通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
  2. 参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
  3. 抽象层尽量保持稳定,一旦确定即不允许修改
开闭原则总结:面对需求,对程序的改动是通过增加代码进行的,而不是改变原来的代码。

依赖倒转原则(Dependency Inversion Principle,DIP)

  • 概念:
    程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
  1. 高层模块不应该依赖低层模块,两者都应该依赖抽象;
  2. 抽象不应该依赖细节;
  3. 细节应该依赖抽象。
  • 目标:
    依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。

  • 使用注意事项:

  1. 每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备
  2. 变量的表面类型尽量是接口或者抽象类
  3. 任何类都不应该从具体类派生
  4. 尽量不要覆写基类的方法
    如果基类是一个抽象类,而这个方法已经实现了,子类尽量不要覆写。类间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会有一定的影响。
  5. 结合里氏替换原则使用

里氏代换原则(Liskov Substitution Principle,LSP)

  • 概念:
    派生类(子类)对象能够替换其基类(父类)对象被调用

  • 目标:
    LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

  • 总结:

需求变化时,只须继承,而别的东西不会改变。由于里氏代换原则才使得开放封闭成为可能。这样使得子类在父类无需修改的话就可以扩展。

单一职责原则(Single Responsibility Principle, SRP)

  • 概念:
  1. 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中;
  2. 就一个类而言,应该仅有一个引起它变化的原因。
  • 目标:

降低类的复杂度,提高类的可读性,降低程序运行的风险。

单一职责原则总结: 就一个类而言,应该仅有一个引起它变化的原因。

接口隔离原则(Interface Segregation Principle, ISP)

  • 概念:
    客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小接口上。

  • 目标:

接口隔离原则完全符合高内聚低耦合的思想,可以使其拥有更好的扩展性 可读性 可维护性。

  • 使用注意事项:
  1. 一个类对另一个类依赖应该建立在最小的接口上;
  2. 建立单一接口,不要建立庞大臃肿的接口;
  3. 尽量细化每个接口,接口中的方法尽量少。
接口隔离原则总结: 类应该完全依赖相应的专门的接口。

合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

  • 概念:
    尽量使用对象组合/聚合, 而不是继承关系达到软件复用的目的

  • 继承复用和合成复用的优缺点对比:

继承复用缺点合成复用优点
1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
合成复用原则总结: 类中应用,尽量使用对象组合,而不是继承来达到复用的目的。

迪米特法则(Law of Demeter, LOD)

  • 概念:
    说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

  • 目标:

迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

  • 使用注意事项:

迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。(中间件,很重要)

迪米特原则总结: 一个软件实体应当尽可能少的与其他实体发生作用。

参考资料

  1. 百度百科
  2. https://www.jianshu.com/p/b2b420e8beec
  3. http://blog.csdn.net/lovelion/article/details/7563441
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值