• Stars
    star
    2,353
  • Rank 19,551 (Top 0.4 %)
  • Language
    C++
  • Created about 6 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

C++设计模式

C++设计模式

什么是设计模式

“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。 ——Christopher Alexander

如何解决复杂性?

  • 分解
    • 人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。
  • 抽象
    • 更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。

面向对象设计原则

  1. 依赖倒置原则(DIP)
  • 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
  • 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。
  1. 开放封闭原则(OCP)
  • 对扩展开放,对更改封闭。
  • 类模块应该是可扩展的,但是不可修改。
  1. 单一职责原则(SRP)
  • 一个类应该仅有一个引起它变化的原因。
  • 变化的方向隐含着类的责任。
  1. Liskov 替换原则(LSP)
  • 子类必须能够替换它们的基类(IS-A)。
  • 继承表达类型抽象。
  1. 接口隔离原则(ISP)
  • 不应该强迫客户程序依赖它们不用的方法。
  • 接口应该小而完备。
  1. 优先使用对象组合,而不是类继承
  • 类继承通常为“白箱复用”,对象组合通常为“黑箱复用” 。
  • 继承在某种程度上破坏了封装性,子类父类耦合度高。
  • 而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。
  1. 封装变化点
  • 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
  1. 针对接口编程,而不是针对实现编程
  • 不将变量类型声明为某个特定的具体类,而是声明为某个接口。
  • 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
  • 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案。

从封装变化角度对模式分类

组件协作:

单一职责:

对象创建:

对象性能:

接口隔离:

状态变化:

数据结构:

行为变化:

领域问题:

总结

现代较少用的模式

  • Builder
  • Mediator
  • Memento
  • Iterator
  • Chain of Resposibility
  • Command
  • Visitor
  • Interpreter

More Repositories

1

CMU-15-445

CMU的数据库系统课程
C
250
star
2

chatRoom

从零开始实现一个聊天室客户端(用qt实现,在Windows和Linux环境下都行),和在Linux下实现服务器后台
C++
231
star
3

Interview

程序员代码面试指南C++版,更新中
Java
117
star
4

springsnail

《Linux 高性能服务器》附带的项目程序springsnil详细解读,一个负载均衡服务器
C++
114
star
5

yfsCpp11

yfs是一个分布式文件系统(mit6.824)
C++
72
star
6

chitchat

《Go Web 编程》中chitchat博客项目的学习(添加详细中文注释)
Go
50
star
7

Raft-Paxos-Sample

MIT6.824实现分布式一致性算法——Raft&Paxos
Go
44
star
8

simpleFS

基于内存的简易文件系统实现
C++
24
star
9

linux_learing

unix/Linux系统编程手册
C
17
star
10

TinyWebServer

CMU 15-441 项目一 Liso Web服务器
C
17
star
11

HoneyBadgerBFT

一个Byzantine容错的分布式共识协议研究与实现
Go
16
star
12

Cracking-the-Coding-Interview

程序员面试金典(第6版)Go、C++、Rust题解
C++
15
star
13

learn_system_programming_in_rust

通过系统编程学习Rust
Rust
11
star
14

Rust_learning

Rust入门
Rust
6
star
15

high-performance-server

学习高性能服务器及muduo库的解析
C++
6
star
16

gopl_answers

《Go程序设计语言》练习答案
Go
3
star
17

Shell-Scripting-Learning

Linux Shell 脚本攻略第三版学习笔记
Shell
3
star
18

talent-plan

my solution for PingCAP training courses
Go
3
star
19

CS144

我的CS144课程学习记录及解决
3
star
20

note

学习笔记
C++
3
star
21

MIT6.828-2014

MIT6.828-2014实验笔记
C
3
star
22

cos461

普利斯顿大学的计算机网络课程
Go
2
star
23

ProgrammingErlang

Erlang程序设计(第2版)读书笔记,包含源代码和课后练习答案
Erlang
2
star
24

go-leveldb

Go语言实现leveldb学习版
Go
1
star
25

CS110L

CS 110L: Safety in Systems Programming
C
1
star
26

mini_distributed_system

实现一个简单的分布式系统,不用任何框架
Go
1
star
27

geek_time

极客时间学习笔记
1
star
28

leetcode

my leetcode solution, C++,Go,python,Rust
C++
1
star
29

crawl_funds

用Go语言实现基金的爬取
Go
1
star
30

CandCPP_programing

leetcode
C
1
star
31

naivechain

区块链的简单实现
C++
1
star
32

token_bucket

几十行代码实现令牌桶算法
Go
1
star