前言
既然百度的破空间功能那么弱,而优快云又支持Markdown,我打算继续用我的优快云吧。
感觉不能在野路子上越走越远,所以我打算系统的学习设计模式。这里记录的是我看《大话设计模式》的读书笔记。
面向对象思想
单一职责原则
“就一个类而言,应该仅有一个引起它变化的原因。”
“如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受意想不到的破坏。”
开放封闭原则
“对于扩展是开放的,对于更改是封闭的。”
“无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。”
依赖倒置原则
- A.“高层模块不应该依赖低层模块。两者都应该依赖于抽象。”
- B.“抽象不应该依赖于细节,细节应该依赖于抽象。”
“针对接口编程,不要对实现编程。”
里氏替换原则
“子类型必须能够替换掉它们的父类型。”
由于子类型的可替换性才似的使用父类类型的模块在无需修改的情况下就可以扩展。
设计模式
简单工厂模式Factory
一言以蔽之,简单工厂干的就是个根据参数构造类的活。
可见性:用户需要知道抽象基类和工厂类/函数。
class IEvent {
public:
virtual void DoSomething() = 0;
};
class EventA : public IEvent {
public:
void DoSomething();
};
class EventB : public IEvent {
public:
void DoSomething();
};
IEvent *CreateEvent(type) {
switch (type) {
case A:
return new EventA();
case B:
return new EventB();
}
};
策略模式Stragedy
策略模式本身比较像基于接口编程。比如
class CEventDispatcher {
public:
void DoSomething() {
IEvent *pEvent; //此处略去构造
pEvent->DoSomething();
}
};
如果与上面简单工厂模式相结合,可让使用者不关心抽象基类,只需要知道策略的上下文类Context。
装饰模式Decorator
装饰模式是为了避免直接往已有的类中添加功能,而把功能放在子类中。并且子类提供和基类相同的接口。
可见性:装饰类和被装饰类。
class CComponent {
public:
void DoSomething() {}
};
class CDecorator {
public:
void Decorate(CComponent *pComponent) {
m_pBase = pComponent;
}
void DoSomething() {
if (m_pBase != NULL) {
m_pBase->DoSomething();
}
}
private:
CComponent *m_pBase;
};
class CDecoratorA : public CDecorator {
public:
void DoSomething() {
CDecorator::DoSomething();
//do my thing
}
};
代理模式Proxy
常用于下面四种情况:
- 远程代理,远程通信本地化调用。
- 虚拟代理,根据需要创建开销很大的对象。
- 安全代理,用来控制真实对象访问时的权限。
- 智能指引,即引用计数。
工厂方法模式
将工厂让用户来实例化,对于简单类来说,个人觉得不一定比依赖实现编程更爽。