ACE 主动对象模式的按部就班的实现方法
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 主动对象模式的按部就班的实现方法的更多相关文章
- ACE主动对象模式
ACE主动对象模式 ACE主动对象模式解决的核心问题是,异步调用及线程context的切换.ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accep ...
- ACE主动对象模式(2)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...
- ACE主动对象模式(1)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式
鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...
- 【设计模式 - 21】之空对象模式(Null Object)
1 模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...
随机推荐
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- inline与lnk2001、lnk2019,鸡肋?
inline函数居然出现了lnk2001.lnk2019,先贴代码. a.h #pragma once class A { public: inline void foo(); void us ...
- (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...
- Java模拟POST表单提交HttpClient操作
public static void Login() { String url = "http://www.***.com/login"; PostMethod postMetho ...
- 关于__stdcall和__cdecl调用方式的理解
__stdcall和__cdecl都是函数调用约定关键字,先给出这两者的区别,然后举实例分析: __stdcall:参数由右向左压入堆栈:堆栈由函数本身清理. __cdecl:参数也是由右向左压入堆栈 ...
- 【android】禁止Edittext弹出软键盘而且使光标正常显示
/** * 禁止Edittext弹出软件盘,光标依旧正常显示. */ public void disableShowSoftInput() { if (android.os.Build.VERSION ...
- Unix文本处理工具之awk
Unix命令行下输入的命令是文本,输出也都是文本.因此,掌握Unix文本处理工具是很重要的一种能力.awk是Unix常用的文本处理工具中的一种,它是以其发明者(Aho,Weinberger和Kerni ...
- 【css基础】垂直外边距的合并
近期在重温<CSS权威指南>,还是想把基础再打坚固点,如今对垂直外边距的合并问题进行简单总结. 1. 两个块级元素的外边距都大于0时,取那个最大值作为两个块级元素的垂直边距 请看以下一个小 ...
- queue C++
#include <iostream> using namespace std; class DequeEmptyException { public: DequeEmptyExcepti ...
- python 学习笔记 10 -- 正則表達式
零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...