设计模式作用
解决同一种类型的问题,使用设计模式可以让代码结构更加清晰。
设计模式一图总览
C# 设计模式目录
C# 工厂模式
C# 单例模式
C# 观察者模式
C# 代理模式
C# 策略模式
C# 中介模式
C# 外观(门面)模式
C# 组合模式
C# 原型模式
C# 模板方法模式
C# 备忘录模式
C# 迭代器模式
C# 装饰器模式
C# 桥接模式
C# 状态模式
C# 责任链模式
C# 命令模式
C# 享元模式
正在持续更新中......
七大设计原则
开闭原则(Open Closed Principle,OCP)
- 概念:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。 - 目标:
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。 - 使用注意事项:
- 通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
- 参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
- 抽象层尽量保持稳定,一旦确定即不允许修改
开闭原则总结:面对需求,对程序的改动是通过增加代码进行的,而不是改变原来的代码。 | |
---|---|
依赖倒转原则(Dependency Inversion Principle,DIP)
- 概念:
程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
- 高层模块不应该依赖低层模块,两者都应该依赖抽象;
- 抽象不应该依赖细节;
- 细节应该依赖抽象。
-
目标:
依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。 -
使用注意事项:
- 每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备
- 变量的表面类型尽量是接口或者抽象类
- 任何类都不应该从具体类派生
- 尽量不要覆写基类的方法
如果基类是一个抽象类,而这个方法已经实现了,子类尽量不要覆写。类间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会有一定的影响。- 结合里氏替换原则使用
里氏代换原则(Liskov Substitution Principle,LSP)
-
概念:
派生类(子类)对象能够替换其基类(父类)对象被调用 -
目标:
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。 -
总结:
需求变化时,只须继承,而别的东西不会改变。由于里氏代换原则才使得开放封闭成为可能。这样使得子类在父类无需修改的话就可以扩展。 | |
---|---|
单一职责原则(Single Responsibility Principle, SRP)
- 概念:
- 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中;
- 就一个类而言,应该仅有一个引起它变化的原因。
- 目标:
降低类的复杂度,提高类的可读性,降低程序运行的风险。
单一职责原则总结: 就一个类而言,应该仅有一个引起它变化的原因。 | |
---|---|
接口隔离原则(Interface Segregation Principle, ISP)
-
概念:
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小接口上。 -
目标:
接口隔离原则完全符合高内聚低耦合的思想,可以使其拥有更好的扩展性 可读性 可维护性。
- 使用注意事项:
- 一个类对另一个类依赖应该建立在最小的接口上;
- 建立单一接口,不要建立庞大臃肿的接口;
- 尽量细化每个接口,接口中的方法尽量少。
接口隔离原则总结: 类应该完全依赖相应的专门的接口。 | |
---|---|
合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
-
概念:
尽量使用对象组合/聚合, 而不是继承关系达到软件复用的目的 -
继承复用和合成复用的优缺点对比:
继承复用缺点 | 合成复用优点 |
---|---|
1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。 | 1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。 |
2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。 | 2. 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。 |
3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。 | 3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。 |
合成复用原则总结: 类中应用,尽量使用对象组合,而不是继承来达到复用的目的。 | |
---|---|
迪米特法则(Law of Demeter, LOD)
-
概念:
说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。 -
目标:
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
- 使用注意事项:
迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。(中间件,很重要)
迪米特原则总结: 一个软件实体应当尽可能少的与其他实体发生作用。 | |
---|---|