4 命令模式
简单来说,命令模式就是把所有的操作用对象来进行封装
目的:1.实现发送跟接收的解耦
2.能够获取更多的信息
首先 每个command 有一个执行者。
class Command
{
public:
Command(){}
Command(Barbecuer *receiver):p_receiver(receiver){}
virtual void ExecuteCommand() = 0; //执行命令
protected:
Barbecuer *p_receiver;
};
接收者有一个命令的容器
class Receiver
{
public:
void SetOrder(Command *command);
void Notify();
private:
vector<Command *>p_commandList; //这里相当于一个命令对象队列
};
这样 每次有新的command生成时,只要添加到接收者的容器中即可。具体的执行,只要调用每个command的exectute即可,这样也不会将执行者暴露出来,也没有必要知道,再任务建立时就已经确认。
5 代理模式
简单的说,一个类接收另一个类的实例,来帮助被接收的类完成逻辑的补充
目的:解耦逻辑与实现,比如A类实现某个功能,可以让代理B类来进行填充逻辑,这样也就不用修改A类
class Proxy:public Subject
{
public:
Proxy();
Proxy(Subject* _sub);
void Request()//实现对委托者的委托任务执行与补偿
{
bef();
this->_sub->Request();
end();
}
void bef()
{}
void end()
{}
~Proxy();
private:
Subject* _sub;
};
6.享元模式
简单来说, 共享元素,节省内存。
目的:避免重复的创建小细粒度的对象。当然有些应用就是多个实例的成员变量只有一个实例。
class FlyweightFactory//享元工厂
{
private:
map<string,Flyweight*>flyweights;//模块名列表
public:
FlyweightFactory()//初始共享模块列表
{
flyweights["X"]=new ConcreteFlyWeight();//这里需要用堆,因为这是给客户程序返回的,如果不用堆,则会返回局部对象的引用
flyweights["Y"]=new ConcreteFlyWeight();
flyweights["Z"]=new ConcreteFlyWeight();//所有的属性为“Z”的模块都只对应这个一个实例,这正是享元模式的精髓所在呀
}
Flyweight* GetFlyWeight(string key)//工厂返回享元对象,而这些对象的属性都存放在一个该工厂的模块名列表中
{
if(!flyweights.count(key) )//先检查下是否在列表中,如果不在则新建该列表项
{
flyweights[key]=new ConcreteFlyWeight();//这里只能返回堆空间,否则在主函数中将出处
}
return flyweights[key];
}
map<string,Flyweight*>::size_type countN()//返回当前有多少个可供共享的模块
{
return flyweights.size();
}
};