用bind来解耦

本文介绍如何利用Boost库中的bind和function组件实现不同组件间的解耦。通过示例展示了CReader和CSaver两个类如何通过bind进行连接,以及这种方式如何帮助减少类间的依赖。
转自: 用bind来解耦

应用了boost::bind, boost::function, boost::test
代码稍有修改。

#define BOOST_AUTO_TEST_MAIN
#include <boost/test/auto_unit_test.hpp>
#include <boost/test/included/unit_test_framework.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <string>

using namespace std;

//声明一个函数指针的类型
typedef void (* ON_SEGMENT) (char *);

//用function<> 和指针回调指针来解除耦合
//注意解耦效果: CReader 和 CSaver 没有任何关系

class CReader
{
public:
CReader()
{
m_pFunc=NULL;
m_functor=NULL;
};

void UseFreeFunc(ON_SEGMENT pFunc)
{
m_pFunc=pFunc;
};

void UseFunctor(boost::function<void(char *)> functor)
{
m_functor= functor;
};

void Read(char * pchar)
{
if(m_pFunc)
{
m_pFunc(pchar);
};
if(m_functor)
{
m_functor(pchar);
};
}

private:
ON_SEGMENT m_pFunc;//函数指针
boost::function<void(char *)> m_functor; //函数对象
};

class CSaver
{
public:
//接受输入的字符,保存在内部变量m_str
void Input(char * pchar)
{
m_str.append(pchar);
};

string m_str;
};

BOOST_AUTO_TEST_CASE(test_bind)
{
//两个类并不知道对方的任何细节
CSaver saver;
CReader reader;

//预先 把函数 CSaver::Input 和要操作的数据 &saver 注册到 reader
//只要函数形式符合(返回值是void,传入参数是char *),都可以注册
//解除CSaver 和 CReader的耦合
//bind产生的函数对象,重载操作符()
//函数对象的本质是 函数指针加this指针,即 操作和数据
//函数对象 比 函数指针优越的地方是可以带有内部状态

reader.UseFunctor( boost::bind(&CSaver::Input, &saver, _1) );

//延时调用,解除CSaver 和 CReader的耦合
//把字符从reader 放入 saver里面
reader.Read("Hello");
reader.Read("Mafeitao");

BOOST_CHECK(saver.m_str=="HelloMafeitao");
}

//asio 里面的 async_accept 的简化版本
//可以接受 函数指针; 比如 async_accept(FreeFunc,Para)
//可以接受 函数对象; 比如
// CSaverFunctor func;
//async_accept(func,Para)
//可以接受 bind
template <typename AcceptHandler,typename Para>
void async_accept(AcceptHandler handler, Para p)
{
handler(p);
};

// 自由函数,没有内部状态
void FreeFunc(char * pChar)
{
printf("In FreeFunc %s\n", pChar);
}

BOOST_AUTO_TEST_CASE(bind_asio)
{
//类 CSaver 和 模板函数 async_accept,没有任何关系
CSaver saver;
char *pchar="Hello";

//bind生成一个临时的functor类 CSaverTemp
//类似于
/*
class CSaverTemp
{
public:

void operator ()(char * pchar)
{
m_str.append(pchar);
};
string m_str
}

CSaverTemp saver;
async_accept(saver,pchar);
}
*/
//全局函数 async_accept,接受一个bind产生的函数对象( 函数指针和this指针)
async_accept( boost::bind(&CSaver::Input, &saver,_1) , pchar);

BOOST_CHECK(saver.m_str=="Hello");
pchar="Mafeitao";
async_accept( boost::bind(&CSaver::Input, &saver,_1) , pchar);
BOOST_CHECK(saver.m_str=="HelloMafeitao");

//接受 全局函数指针,和下面的效果一样
async_accept( boost::bind(FreeFunc,_1), pchar);
//接受 全局函数指针,和上面的效果一样
async_accept( FreeFunc, pchar);
}

//带有模板函数的类
class TReader
{
public:
//模板函数
template <typename OnReadHandler,typename Para>
void Read(OnReadHandler & handler, Para p)
{
//可以接受 函数指针,参数
//可以接受 函数对象,参数
//可以接受 bind
handler(p);
};
};

BOOST_AUTO_TEST_CASE(bind_template)
{
TReader reader;
CSaver saver;
char *pchar="Hello";
boost::function<void (char*)> handler
= boost::bind(&CSaver::Input, &saver,_1);
reader.Read(handler, pchar);
BOOST_CHECK(saver.m_str=="Hello");

pchar="Mafeitao";
reader.Read(handler, pchar);
BOOST_CHECK(saver.m_str=="HelloMafeitao");
}

//函数对象,重载操作符()
//函数对象的本质是 函数指针加this指针,即 操作和数据
//函数对象 比 函数指针优越的地方是可以带有内部状态
class CSaverFunctor
{
public:
void operator ()(char * pchar)
{
m_str.append(pchar);
};
string m_str;
};

BOOST_AUTO_TEST_CASE(test_functor)
{
//带有模板函数的类
TReader reader;

//函数对象
CSaverFunctor saver;

//把字符从reader 放入 saver里面
char *pchar="Hello";
reader.Read( saver , pchar);

pchar="Mafeitao";
reader.Read( saver , pchar);
BOOST_CHECK(saver.m_str=="HelloMafeitao");
}


【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值