常用设计模式总结二 ------- 命令模式,代理模式,享元模式

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();
	}
};

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值