8.17
上午
改不规范的老代码,
下午
遇到一个最近访问列表Bmp刷新有问题,但我用了将近2个小时才必现了问题。
晚上
工厂模式
工厂方法: 实例化延迟到子类
NN项目中有一个简单的工厂方法,主要思想就是把对象的创建封装进了工厂中,对具体客户类实现了对象创建细节的屏蔽。
抽象工厂: 一套产品
单例模式
全局对象在程序一开始的时候就创建了,如果一段时间没有使用,会耗费资源。单例模式在需要用到的时候才创建。——延迟实例化
构造函数私有化——“鸡生蛋”还是“蛋生鸡”
多线程情况下:
加锁是一种解决方法,但是除了第一次以外,以后每次都不需要锁了,性能下降较多
急切创建实例,声明静态变量即初始化——耗费资源
双重检查加锁
单例可以设计成泛型类,项目中方便使用
FTBaseAPI的延迟初始化的单例泛型是什么鬼,没看懂……
8.18
上午:
策略模式:
如果每次新的需求一来,都会使某方面的代码发生变化——封装起来:
比如某个菜单,它的菜单项可能是会经常修改的。
现状: 鸭子基类放太多函数,子类不一定要用到,每加入一个子类就得改。
如果把鸭子基类的函数外放接口让各个子类继承,每个子类中存在的重复代码又太多了!
以上两种做法,都把行为放进了鸭子类中实现
根本点就是: 飞和叫的函数随着具体鸭子的不同而改变。
行为“外包”给行为对象,鸭子和“行为对象”组合在一起,还可以动态改变。
《Head First》中的最后代码,子类中仍然是面对实现编程,个人认为可以加上一个工厂模式去创建不同的Beaviour类,屏蔽对象创建的细节!
下午
观察者模式
- 观察者模式的代表人物: MVC
- 观察者模式有“推”和“拉”两种,“推”一般是自己在通知函数加入参数,“拉”一般是通知观察者,让观察者调用被观察者的Getter方法获取数据。
“推”数据的缺点——以后这些数据的类型和个数是可能要变化的,这个变化没有被很好的封装 - 许多GUI框架都使用着观察者模式。
- 观察者模式将许多观察者“组合”进被观察者中,符合“多用组合,少用继承”的设计原则。
装饰模式
“组合”和“委托”可以在运行时具有继承行为的效果
继承设计子类,行为是在编译时静态决定的,所有子类会继承到相同的行为。利用组合的做法,可以在运行时动态地进行扩展。
装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
对象可以在任何时候被装饰,运行时动态地,不限量地用装饰者来装饰对象。
利用继承得到“类型匹配”,而不是利用继承得到“行为"。
利用”工厂“和”生成器“设计模式,将有更好的方法建立被装饰者对象。
装饰模式的缺点:
- 有很多小类,容易造成困扰。
- 不能依赖特殊的子类类型做特定的操作,都是统一使用基类的函数接口。
3.《Head First》中的例子的次序是有一定规律的,”饮料类“是必须在最里层的,”调料类“的次序无关紧要——这点在加入”调料价格根据咖啡容量大小改变"的扩展中会有涉及。
8.20
上午
随便看看需求
下午
需求预审,编码规范PPT
晚上
技术分享会议
命令模式
- 分为四个角色: 客户,调用者,命令对象,接收者,分别对应于: 顾客,服务员,订单,厨师
- 可以实现undo操作的方法通常是“记录以前的状态”
- 缺点是:会生成许多的命令子类
学习到了持有——也就是有一个成员变量,这个是编译时期决定的,和观察者模式的动态注册相对应
对象的序列化 与 对象的持久化??
8.27
写一个继承CWind的类,CWind的m_hwnd怎么一直是NULL,要如何赋值?
需要学习C++11的lamba表达式
8.9月之交
适配器模式——转换接口,为了兼容性
有对象适配器和类适配器,类适配器需要用到多重继承
外观模式——统一和简化接口,就是传说中的“把这些代码封装成一个函数啊!”
- 适配器将一个对象包装起来以改变其接口
- 装饰器将一个对象包装起来以增加新的行为和责任
- 外观将一群对象"包装"起来以简化其接口
9.06
设计模式之“最少知识原则”:
在一个对象的方法之内,应该只调用属于以下范围的方法:
- 该对象本身
- 被当作方法的参数而传递进来的对象
- 此方法所创建或实例化的任何对象
- 对象的任何组件(has-a的关系)
9.08
模板方法模式
定义了算法的步骤,把部分步骤的实现延迟到子类
类似的,C++的sort中需要传入对象重载 < 操作符,其实也是使用模板方法模式
策略模式
策略模式和模板方法模式都封装了算法,一个用组合,一个用继承
工厂方法是模板方法的一种特殊版本
迭代器模式
单一责任: 一个类应该只有一个引起变化的原因
一个模块或者一个类被设计成只支持一组相关的功能时,我们就说它具有高内聚
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
组合模式
将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
9.09
状态模式
代理模式
代理模式 和 装饰者模式:目的不一样,装饰者为对象增加行为,而代理是控制对象的访问。
代理模式 和 适配器模式:代理和适配器都是挡在其他对象的前面,并负责将请求转发给它们,适配器会改变对象适配的接口,而代理则实现相同的接口。
复合模式
MVC
- 模型对视图和控制器是一无所知的,它们之间是完全解耦的。
- 控制器是视图的“策略”(策略模式)
桥接模式
访问者模式
对于对象组合,访问者可以调用每个对象的GetState方法,参数是该对象的引用,访问者就可以随意调用该对象的任意方法,操作的改变都封装到了访问者类中。
不过缺点就是破坏了被访问者的封装性。