Observer
委托方Subject数据变化时,委托Observer更新其继承者状态应有的变化。打个比方,头顶有两个灯,分别投射出两个影子,弯腰时两个影子有各自的变化;这个人就是subject,影子这个概念是Observer,地面上实际的两个阴影是Observer的继承者。
class Subject {
public:
vector<Observer*> obss;
void registerObs(Observer* obs) {
obss.pushback(obs);
}
int setValue(int value) const {
m_value = value;
notify();
}
void notify() const {
for(int i = 0; i < obss.size(); i++) {
obss.updateValue(this, value);
}
}
private:
int m_value;
}
class Observer {
public:
virtual void updateValue(Subject* sub, int value) const = 0;
}
Composite
文件夹下面有文件夹,也有文件,两者都可以打开和关闭;但文件有读写功能文件夹没有。文件和文件夹都继承自一个父类;文件夹委托父类来完成公共的功能。
class Composite
{
int mValue;
public:
Composite(int value) {
mValue = value;
};
virtual void add(Composite* elem){};
}
class Folder : public Composite
{
vector<Composite*> elems;
public:
Folder(int value) : Composite(value);
void add(Composite* elem) {
elems.push_back(elem);
}
}
class File : public Composite
{
public:
File(int value) : Composite(value);
}
Prototype
设计框架获取未来子类的对象:子类的对象由子类创建,创建好后注册到父类。