ACE的主动对象模式的实现

对分布式系统设计来说,ACE提供的主动对象模式是让我们在系统框架构建的时候,回归到传统的单线程编程思维。你可能要问,既然有主动对象,那必然有被动对象,没有错,确实有被动对象,那到底什么是主动对象?什么又是被动对象呢?

被动对象:

假如我们要给一个客户端提供一个方法,计算两个数之和。我们一般定义一个对象,然后实现具体的加法运算操作,客户端在调用的时候,首先实例化我们这个对象,然后再执行这个方法。此时,这个对象的加法运算操作的执行和客户端的调用线程在一个线程中完成。这是标准的单线程执行顺序。我们把这种对象叫做被动对象,被动对象所提供的方法叫做被动对象的方法。

主动对象:

同理,假如我们要给一个客户端提供一个方法,计算两个数之和。同样我们如果实现了一个主动对象,同时给这个主动对象增加一个计算两个数之和的主动对象方法,那么当客户端调用这个主动对象所提供的方法的时候,这个对象的加法运算操作的执行和客户端的调用线程就不在一个线程中完成。而是在另外的一个线程中执行。我们把这种对象叫做主动对象,主动对象所提供的方法叫做主动对象的方法。

// ActiveObject.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "ace/OS_NS_unistd.h"
#include "ace/Activation_Queue.h"
#include "ace/Method_Request.h"
#include "ace/Task.h"
#include "ace/Future.h"
#include "ace/Auto_Ptr.h" class CAdd;
class CAdd_MethordRequest;
class CScheduler;
class CAgent; //第一步: 实现一个被动对象
class CAdd
{
public:
CAdd(int a1, int a2)
{
m_a1 = a1;
m_a2 = a2;
}
~CAdd(void)
{
}
public:
int calculate_add()
{
return m_a1 + m_a2;
} int geta1()
{
return m_a1;
} int geta2()
{
return m_a2;
}
private:
int m_a1;
int m_a2;
}; //第二步:从 ACE_Method_Request 继承一个对象,实现他的虚函数 void call()
class CAdd_MethordRequest : public ACE_Method_Request
{
public:
CAdd_MethordRequest(CAdd add, ACE_Future<int>& retvalue)
{
m_padd = new CAdd(add.geta1(), add.geta2());
returnVal_ = retvalue;
}
~CAdd_MethordRequest(void)
{
delete m_padd;
}
public:
virtual int call(void)
{
this->returnVal_.set(this->m_padd->calculate_add());
return 0;
}
private:
CAdd *m_padd;
ACE_Future<int> returnVal_;
}; //第三步,实现一个task, 其中定义一个ACE_Activation_Queue对象
class CScheduler : public ACE_Task_Base
{
public:
CScheduler(void)
{
this->activate();
} ~CScheduler(void)
{
} public:
virtual int svc (void)
{
while (1)
{
auto_ptr<ACE_Method_Request> request (this->activation_queue_.dequeue());
if (request->call() == -1) break;
}
return 0;
}
int enqueue (ACE_Method_Request *request)
{
return this->activation_queue_.enqueue (request);
} private:
ACE_Activation_Queue activation_queue_;
}; //第四步,实现一个主动对象
class Agent
{
public:
Agent()
{
}
~Agent(void)
{
}
public:
//这个才是真正的主动对象的方法,这个方法才是客户端调用的真正的方法
ACE_Future<int> calculate_add(int a1, int a2)
{
ACE_Future<int> result;
CAdd add(a1, a2);
this->scheduler_.enqueue(new CAdd_MethordRequest(add, result));
return result;
}
private:
CScheduler scheduler_;
}; int main(int argc, char* argv[])
{
ACE_Future<int> results[10];
//定义主动对象
Agent agent;
for (int i = 0 ; i < 10; i++)
{
//调用主动对象的方法
results[i] = agent.calculate_add(i, i);
} //模拟客户端去做其他事情了
ACE_OS::sleep (5); //这个事检测调用了主动对象方法的返回值,在时间情况中在其他线程中。
for (int j = 0; j < 10; j++)
{
int result = 0;
results[j].get(result);
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("calculate result: %d\n"), result));
} ACE_Thread_Manager::instance ()->wait (); return 0;
}

ACE 主动对象模式的按部就班的实现方法的更多相关文章

  1. ACE主动对象模式

    ACE主动对象模式 ACE主动对象模式解决的核心问题是,异步调用及线程context的切换.ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accep ...

  2. ACE主动对象模式(2)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...

  3. ACE主动对象模式(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...

  4. 设计模式- 主动对象(Active Object)

    译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...

  5. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  6. ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

  7. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  8. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  9. C# 设计模式之空对象模式

    最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...

随机推荐

  1. Spring Security Source Code -- 验证标准流程

    除了初始阶段: 主干验证流程链: MyInvocationSecurityMetadataSource.getAttributes(Object) line: 43     MyFilterSecur ...

  2. java基础---->java调用oracle存储过程(转)

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...

  3. java.util.zip - Recreating directory structure(转)

    include my own version for your reference. We use this one to zip up photos to download so it works ...

  4. Static关键字的作用及使用

    1.使用static声明属性 如果希望一个属性被所有对象共同拥有,可以将其声明为static类型. 声明为static类型的属性或方法,此属性或方法也被称为类方法,可以由类名直接调用. class P ...

  5. 事件总线帧---Otto

    我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...

  6. Cocos2d-x串算出Size方法

    项目需要,根据所输入的字符串,的需要计算串帐户Size. 包代码如下面.只需要传递一个字符串,您可以返回Size: Size ChartDemoScene::calculateFontSize(con ...

  7. Routing 服务

    WCF Routing 服务 WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发, ...

  8. 苹果iOS手机系统诊断功能是后门吗?

    7月20日,美国知名苹果iOS手机系统侦破专家扎德尔斯基在2014年世界黑客大会(HOPE/X)用幻灯片讲演揭露了苹果手机存在系统级"后门". 为此,7月23日.苹果公司马上做出回 ...

  9. JAVA card 应用开发(三) 把APPLET(CAP文件)装载到卡片

    依据前面两篇博文.我们能够在Eclipse上建立好Applet.而且能够有多个AID.能够选择不同的应用. 那么,以上我们都是基于模拟环境的逻辑,实际上有些函数接口是须要实际的环境.就是说我们须要把A ...

  10. C#文件流写入方法

    stream为服务端接收的文件流 var bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的 ...