作业简介
| 这个作业属于哪个课程 | 课程链接 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 了解并熟悉常见的软件设计原则,设计模式 |
| 回顾在过去的软件设计过程中接触过哪些设计原则和设计模式 | |
| 掌握常见的设计原则和设计模式并运用到后续的软件设计中 |
参考书籍
| 名称 | 作者 | 简介 |
|---|---|---|
| 《大话设计模式》 | 程杰 | 以情景对话的形式,用多个小故事或编程示例来组织讲解GOF总结的23个设计模式。 |
参考网站
内容归纳
7大设计原则
单一职责原则(Single Responsibility Principle)
一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。
里氏替换原则(LSP liskov substitution principle)
子类可以扩展父类的功能,但不能改变原有父类的功能。继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。
依赖倒置原则(dependence inversion principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。
接口隔离原则(interface segregation principle)
客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。
一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
开放封闭原则(open closed principle)
软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification)。
迪米特原则 (law of demeter)
只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
合成复用原则(Composite Reuse Principle)
在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
23种设计模式
创建型模式
- 单例模式
- 原型模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
结构型模式
- 代理模式
- 适配器模式
- 桥接模式
- 装饰模式
- 外观模式
- 享元模式
- 组合模式
行为型模式
- 模板方法模式
- 策略模式
- 命令模式
- 职责链模式
- 状态模式
- 观察者模式
- 中介者模式
- 迭代器模式
- 访问者模式
- 备忘录模式
- 解释器模式
迭代器模式
在C++中,会经常使用STL。STL是一个标准模板库,其中包含了各种常用的数据结构,如映射(map),集合(set)。虽然这些都是关联容器,但是也有时需要遍历整个容器内部。为了保护内部表示,STL提供了一系列的迭代器来让用户选择遍历方法并保护内部数据。
简例
有时候我们对集合的运用不只是查询某个元素是否存在,甚至想按照一定的顺序来输出元素,如升序或降序。熟悉STL的人就会知道set的底层实现是红黑树(Red Black Tree),一种平衡二叉查找树,所以可以按大小顺序来获取set中的内容,而遍历内部的方法便是使用迭代器。
源代码
int main(){
set <int> *st = new set <int>;
// 向set内添加元素
for(int i = 10; i >= 1; i--)
st->insert(i);
// 按照升序输出set内的元素
for(set<int>::iterator it = st->begin(); it != st->end(); it++)
cout << *it << " ";
cout << endl;
std::system("pause");
return 0;
}
运行结果

心得体会
学习并掌握设计模式是一个coder的必经之路。掌握设计模式是为了使得代码具有更好的可读性,可拓展性,可维护性。一个项目的代码不仅仅是一个人的成果,还是一个团队共有的成果。
后台编辑界面截图

浙公网安备 33010602011771号