设计模式简介
设计模式简介
- 什么是设计模式?
设计模式就是一套呗反复使用,多数人知晓的、经过分类的、代码设计经验的总结 - 使用设计模式的目的
是为了提高代码的可重用性,让代码容易被同行理解、维护和扩张。
设计的基本原则
- 高内聚,低耦合
- 面向对象、面向接口编程
- 多用组合,少用继承
- 对扩展开放,对修改封闭
多用组合,少用继承
- 引入新功能的时候,往往会从现有代码内,找个功能相近的类,从他继承,然后把新功能追加进去。
- 随着项目的进展,新功能的扩充,子类和父类就越来越紧密,很难维护。
下面这个接口是UI层提出的
interface iSectorDataMgr
{
StartSectorSrv(); //启动
GetReady(); //准备好了?
GetSubSectorIDs(); //取子模块
GetSecurities(); //取股票
GetSearchRange(); //搜索范围
SetSearchRange(); //搜索范围
SectorSearch(); //执行搜索
}
为了UI的方便性,这个接口也算合理。并且方法是一个一个逐步加上去的。
但中间层实现的时候,把所有功能都写在一个类内,或者不断的从现有类派生出子类来扩充功能,就不太合适。
合理的做法是:
- 把功能相近的方法,合并后,用小类各自实现。
- 然后把这些小类,组合到一个大类内,提供给ui使用。
最终把大类拆分成四个小类
XPSearchDataMgr:
public ISectorDataMgr
{
m_setctor_instance; //单例
m_sector_search; //搜索
m_sector_cache; //缓存
m_async; //异步搜索
}
对扩展开放,对修改封闭
- 需求
软件开发过程中,需要扩充功能。 - 矛盾
从外界看来,现有代码只要稍微修改,就能满足需求,但,修改的过程很痛苦,修改的结果是一塌糊涂,错误百出。
本来只是星星之火,修改后已经可以燎原了。
- 期望
在增加新功能的过程中,开发完毕测试完毕的模块,不需要修改。
只要通过系统配置或对象组装,就能把新开发的功能模块,插入现有系统。
各种模式介绍
设计模式分类
- 创建型模式:用来获取对象
单例模式:Singleton
工厂方法模式:Factory
抽象工厂模式:Abstract Factory
建造者模式:Builder
原型模式:Prototype
单例模式:Singleton
用法:
sector* p=sector_factory::GetInstance()->Create()
- 大的程序模块,会不自觉的使用很多全局变量。
- 全局变量的初始化/创建/销毁,往往难管理。
- 可以把这些全局变量,放到一个类中,然后把这个类做成单例
- 这样只需维护一个全局变量就行。
//全局变量
A* g_a=new A();
B* g_b=B::GetInstance()->create()
//封装到一个类中
class AppGlobals
{
static AppGlobals *GetInstance();
A* m_a;
B* m_b;
}
- 注意点:
多线程的应用程序访问和操作单例的全局变量的时候,必须枷锁。
单例的每个方法,必须加锁。
加锁一般在单例对象内部实现。
锁太多,小心发生死锁。
创建单例对象的时候,分懒汉模式和饿汉模式。
懒汉模式在对象呗使用到的时候,才创建对象。
饿汉模式在程序启动的时候,就提前创建好对象。
AppGlobals *GetInstance()
{
if(s_globals==null)
s_globals=new xxx;
return s_globals;
}