泛型仿函数
函数和泛仿函数之间的本质区别在于后者可以存储状态,并可以调用成员函数
特点1.可封装任何处理请求 2.具备型别安全性 3.是一种带有"value语义"的对象
Command设计模式
Command将请求封装与对象之内,“和实际执行者分开存储的工作” 从而降低系统中两个部分之间的依存性
1、应用程序产生一个concreteCommand对象
2、concreteCommand 中的Command接口传给invoker
3、一旦执行时机到了,Command的Execute()虚函数,虚拟调用机制会将这个调用动作发送给ConcreteCommand对象,由后者处理细节,ConcreteCommand找到Receiver对象,并通过该对象实际进行处理。另一种情况是由ConcreteCommand对象全权处理
Command
特性:接口分离:invoker和receiver分离
时间分离:Command保存了一个整装待发的处理请求,供将来运用
环境依赖同样重要
泛化角度分为
主动和被动式两类
Command 运用于UI 提供类似插槽功能
转发命令实际是一个超强的callback,一个泛华的callback,所谓的callback是一个指针
泛型解决问题一
一个转发式Functor不但会委托可调用体,它本身也是一个可调用提,这就造成一个functor能够拥有其他Functor,所以需要返回值泛型化,参数泛型化与参数个数泛型化
template <typename ResultType,class TList>
class Functor
{
...
}
Functor<double,TYPELIST_2(int,double)>myFunctor;
实作
参数个数还是需要辛苦
template<typename R>
class FunctorImpl<R,NullType>
{
public:
virtual R operator{}=0;
virtual FunctorImp* Clone()const =0;
virtual ~FunctorImpl(){};
};
template<typename R,typename P1>
class FunctorImpl<R,TYPELIST_1(P1)>
{
public:
virtual R operator()(P1)=0;
virtual FunctorImp1* Clone()const =0;
virtual ~FuncorImp1(){}
}
template<typename R,typename P1,typename P2>
class FunctorImpl<R,TYPELIST_2(P1,P2)>
{
public:
virtual R operatir(){P1,P2} =0;
virtual FunctorImpl* Clone() const =0;
virtual ~FunctorImpl(){}
};
template<typename R,class TList>
class Functor
{
public:
Functor();
Functor{const Functor&}
Functor& operator={const Functor&};
explict Functor{std::auto_ptr<Impl>spImpl};
...
private:
typedef FunctorImpl<R,TList>Impl;
std::auto_ptr<Impl>spImpl_;
}
函数和泛仿函数之间的本质区别在于后者可以存储状态,并可以调用成员函数
特点1.可封装任何处理请求 2.具备型别安全性 3.是一种带有"value语义"的对象
Command设计模式
Command将请求封装与对象之内,“和实际执行者分开存储的工作” 从而降低系统中两个部分之间的依存性
1、应用程序产生一个concreteCommand对象
2、concreteCommand 中的Command接口传给invoker
3、一旦执行时机到了,Command的Execute()虚函数,虚拟调用机制会将这个调用动作发送给ConcreteCommand对象,由后者处理细节,ConcreteCommand找到Receiver对象,并通过该对象实际进行处理。另一种情况是由ConcreteCommand对象全权处理
Command
特性:接口分离:invoker和receiver分离
时间分离:Command保存了一个整装待发的处理请求,供将来运用
环境依赖同样重要
泛化角度分为
主动和被动式两类
Command 运用于UI 提供类似插槽功能
转发命令实际是一个超强的callback,一个泛华的callback,所谓的callback是一个指针
泛型解决问题一
一个转发式Functor不但会委托可调用体,它本身也是一个可调用提,这就造成一个functor能够拥有其他Functor,所以需要返回值泛型化,参数泛型化与参数个数泛型化
template <typename ResultType,class TList>
class Functor
{
...
}
Functor<double,TYPELIST_2(int,double)>myFunctor;
实作
参数个数还是需要辛苦
template<typename R>
class FunctorImpl<R,NullType>
{
public:
virtual R operator{}=0;
virtual FunctorImp* Clone()const =0;
virtual ~FunctorImpl(){};
};
template<typename R,typename P1>
class FunctorImpl<R,TYPELIST_1(P1)>
{
public:
virtual R operator()(P1)=0;
virtual FunctorImp1* Clone()const =0;
virtual ~FuncorImp1(){}
}
template<typename R,typename P1,typename P2>
class FunctorImpl<R,TYPELIST_2(P1,P2)>
{
public:
virtual R operatir(){P1,P2} =0;
virtual FunctorImpl* Clone() const =0;
virtual ~FunctorImpl(){}
};
template<typename R,class TList>
class Functor
{
public:
Functor();
Functor{const Functor&}
Functor& operator={const Functor&};
explict Functor{std::auto_ptr<Impl>spImpl};
...
private:
typedef FunctorImpl<R,TList>Impl;
std::auto_ptr<Impl>spImpl_;
}