C++设计模式<二>:面向对象设计原则

面向对象设计

变化是复用的天敌,而面向对象设计的最大优势就是抵御变化

面向对象设计原则

1.依赖倒置关系(DIP)

  • 高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定)
  • 抽象(稳定)不应该依赖于实现细节,实现细节应该依赖于抽象(稳定)

如上节 C++设计模式<一>:简介中的例子
其中MainForm(高层模块)应该是稳定的,而第一种方案(分解模式)却依赖于Line和Rect(底层模块);
然而第二种方案(抽象设计模式)MainForm(高层模块)依赖于Shape(抽象),且Line和Rect(底层)也依赖于Shape(抽象),但是注意抽象不应该依赖于底层;这样就实现了隔离变化,把底层的变化给隔离开来。

2.开放封闭原则(OCP)

  • 对扩展开放,对更该封闭
  • 类模板应该是可扩展的,但是不可修改

对于需求变化,我们不应该去想着到处去更改,而是去添加,扩展

3.单一职责原则(SRP)

  • 一个类仅有一个引起它变化的原因
  • 变化的方向隐含着类的责任

类太多的原则,太多的责任,太多的方法,不正常。

4.Liskov替换原则

  • 子类必须能够替换它们的基类(is-a)
  • 继承表达类型抽象

所有需要父类的地方,子类(因为子类is-a父类)都可以传过去,都可以使用。
继承了父类,发现父类的方法有几个不能用了,这就违背了这个原则。

5.接口隔离原则(ISP)

  • 不应该强迫客户程序依赖它们不用的方法
  • 接口应该小而完备

不需要把不必要的方法public,如果是本类使用的话就private,如果是子类使用的话就protected。

6.优先使用对象组合,而不是类继承

  • 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
  • 继承在某种程度上破环了封装性,子类父类耦合度高
  • 而对象组合则只要求被组合的对象具有良好的接口,耦合度低

7. 封装变化点

  • 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良影响,从而实现层次间的松耦合
  • [x] 底层来看:封装就是数据和方法封装成类
  • [ ] 高层来看:我也还不懂,因此需要学习呀。

8. 针对接口编程,而不是针对实现编程

  • 不将变量类型声明为某个特定具体类,而是某个接口(这个当然不是绝对的)
  • 客户程序无需获知对象的具体类型,只需要知道对象所知道的接口。
  • 减少系统中各部分的依赖关系,从而实现“高内聚,松耦合”的类型设计方案

其实软件就是分工协助的工作,因此接口标准化很重要,这也是一个产业强盛的标志。

将设计原则提升为设计经验

  1. 设计习语 Design Idioms
    • Design Idioms描述与特定编程语言相关的底层模式,技巧,惯用法
  2. 设计模式 Design Patterns
    • Design Patterns主要描述的是 “类与相互通信的对象之间的组织关系,包括它们的角色,职责,协作方式等方面”
  3. 架构模式 Architectural Patterns
    • Architectural Patterns描述系统中基本结构组织关系密切的高层模式,包括子系统划分,职责,以及如何组织它们之间关系规则
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++设计模式并没有八大原则,但是设计模式常用的一些原则包括以下几个: 1. 开闭原则(Open-Closed Principle,OCP):件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 2. 单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能或者只有一个引起它变化的原因。 3. 里氏替换原则(Liskov Substitution Principle,LSP):子类必须能够替换掉它们的父类并且保持程序的正确性。 4. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖于底层模块,两者都应该依赖于抽象。 5. 接口隔离原则(Interface Segregation Principle,ISP):不应该强迫客户端依赖于它们不需要的接口。 6. 组合/聚合复用原则(Composite/Aggregate Reuse Principle,CARP):优先使用组合或聚合关系复用代码,而不是继承。 7. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有最少的了解,不和陌生人说话,只和你的朋友(也就是直接的朋友)通信。 8. 最少知识原则(Least Knowledge Principle,LKP):一个件实体应当尽可能少地与其他实体发生相互作用,使得系统的各个部分更独立。 这些原则都是为了提高代码的可维护性、可扩展性、可重用性和可测试性,是面向对象设计和编程非常重要的基本原则。在实际的件开发,应该根据具体的情况选择合适的原则进行应用。同时,这些原则也是设计模式的基础,很多设计模式都是基于这些原则的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值