设计模式-GOF行为模式(6-11)
来源:互联网 发布:wifi免费打电话软件 编辑:程序博客网 时间:2024/06/09 23:33
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
行为型的模式有11种:
1. 责任链Chain of Responsibility
2. 命令Command
3. 解释器Interpreter
4. 迭代器Interator
5. 中介者Mediator
6. 备忘录Memento
7. 监听Observer
8. 状态State
9. 策略Strategy
10. 模板Template
11. 访问者Visitor
参考:https://yuerblog.cc/2017/01/17/gof-design-pattern-of-behavioral-pattern/
参考:http://www.cnblogs.com/gaochundong/p/design_pattern_mediator.html
参考:http://blog.csdn.net/caolaosanahnu/article/details/19647257
6. 备忘录Memento
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。用来恢复对象到保存的状态。
类的实现上:
// create memento, restore state from memento
class Originator
{
public:
Memento* createMemento(){return new Memento(state());}
void setMemento(Memento* m){setState(m->state());}
private:
string state(){return m_state;}
void setState(string s){m_state = s;}
string m_state;
};
// memento
class Memento
{
proteced:
string state(){return m_state;}
void setState(string s){m_state = s;}
Memento(string s):m_state(s){};
friend class Originator;
private:
string m_state;
};
// store memento
class CareTaker
{
public:
CareTaker():m_pMemento(nullptr){}
Memento* getMemento(){return m_pMemento;}
void setMemento(Memento* m)
{
if (m_pMemento) delete m_pMemento;
m_pMemento = m;
}
private:
Memento* m_pMemento;
};
7. 观察者Observer
建立对象与对象的依赖关系,一个对象发生改变时将自动通知其他对象,其它对象作出反应。
发生改变的对象称为:观察目标
被通知的对象称为:观察者
类的实现上:
class Subject;
class Observer
{
public:
void update(Subject *);
};
class Subject
{
public:
void attach(Observer* o)
{
m_list.push_back(o);
};
void detach(Observer* o)
{
m_list.remove(o);
};
void notify()
{
for (auto iter=m_list.begin(); iter != m_list.end(); ++iter)
iter->update();
};
virtual void getState() = 0;
virtual void setState(int n) = 0;
private:
std::list<Observer*> m_list;
};
class ConcreteSubject : public Subject
{
public:
virtual void getState(){return m_nState;}
virtual void setState(int n)
{
m_nState = n;
notify();
}
private:
int m_nState;
};
class ConcreteObserver
{
public:
void update(Subject* s)
{
m_nObstate = s->getState();
};
private:
m_nObState;
};
8. 状态State
状态模式主要是应对状态转换的条件比较复杂的情况,把状态的的判断逻辑转换到表示不同状态的一系列类当中,可以把复杂的状态判断简化。
类的实现:
class State
{
public:
virtual void handle(Handle* p) = 0;
};
class ConcreteStateA : public State
{
public:
virtual void handle(Handle* p)
{
p->changeState(new ConcreteStateB);
}
};
class ConcreteStateB : public State
{
public:
virtual void handle(Handle* p)
{
p->changeState(new ConcreteStateC);
}
};
class ConcreteStateC : public State
{
public:
virtual void handle(Handle* p)
{
p->changeState(new ConcreteStateA);
}
};
class Context
{
public:
Context(State* s):m_state(s){};
void request()
{
m_pState->handle(this);
}
void changeState(State* s)
{
m_pState = s;
}
private:
State* m_pState;
};
9. 策略Strategy
策略模式实现对实现同种算法的封装,让这些算法之间互相可以方便的替代。
类的实现:
class Stragegy
{
public:
virtual void algorithm() = 0;
};
class ConcreteAlgorithm1 : public Stragegy
{
public:
virtual void algorithm()
{
…
}
};
class ConcreteAlgorithm2 : public Stragegy
{
public:
virtual void algorithm()
{
…
}
};
class Context
{
public:
void SetStragety(Stragegy* s){m_pStragegy = s;}
void algorithm()
{
if (m_pStrategy) m_pStrategy->algorithm();
}
private:
Stragey* m_pStrategy;
};
10. 模板Template
模板模式的特点:基类提供了框架和一系列的方法,子类只需要重写特定的方法实现差异的部分即可。
类的实现:
class TemplateClass
{
public:
final void temlateMethod()
{
…
operation1();
…
operation2();
…
};
virtual void operation1();
virtual void operation2();
};
class ConcreteClass1 : public TemplateClass
{
public:
virtual void operation1()
{
…
}
virtual void operation2()
{
…
}
};
11. 访问者Visitor
Visitor模式是把对元素的处理算法交给数据结构类,数据结构遍历自身元素,对每个元素调用该处理。
这样对于数据结构中元素的处理算法,随着不同的访问者改变而改变。
例如:收到指令,对每个银行账户扣款1元的短信提醒费用。
对于银行系统来说,账户的存储结构是不希望外部获取的,外部可以把处理交给存储结构类,有存储结构类来遍历元素,并调用处理。
类的实现:
class Visitor
{
public:
virtual void visitElement(Element* pElement) = 0;
};
class Concrete Visitor: public Visitor
{
public:
virtual void visitElement(Element* pElement)
{
// pElement do something;
}
};
class Element
{
public:
void accept(Visitor* pVisitor)
{
pVisitor->visitElement(this);
};
}
class ObjectStructure
{
public:
void accpt(Visitor* pVisitor)
{
for (iter =m_array.begin(); iter!=m_array.end(); iter++)
iter->accept(pVisitor);
}
private:
vector<Element> m_array;
};
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
- 设计模式-GOF行为模式(6-11)
- GoF设计模式之行为型模式
- 设计模式-GOF行为模式(1-5)
- GOF设计模式阅读笔记之行为模型(上)
- GOF设计模式阅读笔记之行为模型(下)
- 设计模式与GoF
- GOF设计模式
- GoF的设计模式
- GOF设计模式
- GOF设计模式
- ----GoF 设计模式概要
- 戏说GoF设计模式
- GOF设计模式
- 设计模式GOF
- GoF是什么----设计模式
- GOF设计模式
- GOF设计模式
- Gof 23设计模式
- 细说 let 与 var 的不同之处
- 第二章:vue2组件的生命周期钩子函数
- XML和DTD,正则表达式
- 圆的反演
- Kali2017安装openvas7.02
- 设计模式-GOF行为模式(6-11)
- (转)亚马逊创始人贝佐斯:前进路上,善良远比聪明重要
- poj3069贪心
- Mantle的一个坑被我踩到了,快来围观
- Hadoop的特点与缺点
- 时序数据库
- git常见命令使用
- anyoffice 隧道排错指南
- 爱奇艺测试开发实习面经、阿里巴巴安全面经、CVTE c++开发面经