回调框架 不知道异步可以用不,在尝试

原创 2015年07月07日 19:43:11
#include <iostream>
using namespace std;

class ITransaction
{
public:
	virtual ~ITransaction(){}
};
class Task
{
public:
	virtual int process(ITransaction *) = 0;
	virtual void doAfterSync(ITransaction *ctx)
	{

	}
	void setCompleteListener(Task *l)
	{
		mListener = l;
	}
	void complited(ITransaction *ctx)
	{
		std::cout << "complited..." << std::endl;
		if (mListener) {
			mListener->doAfterSync(ctx);
		} else {
			std::cout << "mListener is null" << std::endl;
		}
	}
private:
	Task *mListener;
};

enum {
	START = 0,
	A_START,
	A_COMPLETE,
	B_START,
	B_COMPLETE
};

std::string strStatus[] = {"start", "a_start", "a_complete", "b_start", "b_complete"};
class Transaction : public ITransaction
{
public:
	Transaction():status(START){}
	int status;
};

class TaskA : public Task
{
public:
	TaskA()
	{
	}

	void setBTask(Task *taskB)
	{
		taskB_ = taskB;
	}
	int process(ITransaction *ctx)
	{
		ctx_ = dynamic_cast<Transaction *>(ctx);
		std::cout << "TaskA is running..., status is " << strStatus[ctx_->status] << std::endl;
		switch (ctx_->status)
		{
			case START:
				ctx_->status = A_START;
				std::cout << "status is " << strStatus[ctx_->status] << std::endl;

				taskB_->setCompleteListener(this);
				taskB_->process(ctx_);
				return 1; // not finished
			case B_COMPLETE:
				complited(ctx_);
				return 0;
		}
	}
	void doAfterSync(ITransaction *ctx)
	{
		std::cout << "TaskA::doAfterSync"<< std::endl;
		if (ctx_->status == B_COMPLETE) {
			process(ctx);
		}
	}
private:
	Task *taskB_;
	Transaction *ctx_;
};

class TaskB : public Task
{
public:
	int process(ITransaction *ctx)
	{
		std::cout << "TaskB is running..." << std::endl;
		ctx_ = dynamic_cast<Transaction *>(ctx);
		ctx_->status = B_COMPLETE;
		std::cout << "status is " << strStatus[ctx_->status] << std::endl;
		complited(ctx_);
		return 0;
	}
private:
	Transaction *ctx_;
};

class Controller
{
public:
	Controller(TaskA *taskA, TaskB *taskB) : taskA_(taskA), taskB_(taskB)
	{
	}
	void do_process(Transaction *ctx_)
	{
		taskA_->process(ctx_);
	}

	TaskA *taskA_;
	TaskB *taskB_;
};

int main()
{
	Transaction *ctx = new Transaction;

	TaskA *taskA = new TaskA();
	TaskB *taskB = new TaskB();
	taskA->setBTask(taskB);

	Controller *ctl = new Controller(taskA, taskB);
	ctl->do_process(ctx);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

函数回调机制、异步函数回调机制图例详解

无论是JS的函数回调还是Java回调机制,它们思想都是类似的,简单来说就是,如下图所示:                                在层次一中的方法一(函数)调用层次二中的方法,而...
  • zhangliangzi
  • zhangliangzi
  • 2016年07月29日 20:10
  • 6288

异步调用和回调函数

异步调用在应用程序框架中具有广泛的应用,并且特指多线程情况下。它同Windows的消息循环机制,消息响应,消息队列,事件驱动机制以及设计模式中的观察者模式等都是紧密相关的。        回调函数用于...
  • kobejayandy
  • kobejayandy
  • 2013年12月29日 16:26
  • 9452

支付宝异步回调

层次决定理解,还是理解不够,实践缺欠 现支付宝的通知有两类。  A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式  B页面跳转通知,对应的参数为retu...
  • qiandublog
  • qiandublog
  • 2016年12月01日 13:24
  • 2744

同步和异步回调

同步和异步回调作者:havoc (原文地址:http://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)...
  • yunnysunny
  • yunnysunny
  • 2015年03月29日 14:38
  • 3335

深入浅出: Java回调机制(异步)

Writer      :BYSocket(泥沙砖瓦浆木匠) 什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃 哈哈,看着...
  • u010164190
  • u010164190
  • 2017年01月06日 16:38
  • 456

python异步回调函数的实现

说到异步回调函数的应用,最经典的就是ajax。 首先我们回想一下ajax是如何工作的。variable=new XMLHttpRequest(); xmlhttp.onreadystatechang...
  • payinglee
  • payinglee
  • 2013年06月01日 19:48
  • 14539

java接口回调、同步回调、异步回调

一、回调         回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。         例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处...
  • tfygg
  • tfygg
  • 2016年05月15日 16:20
  • 2200

异步事件回调机制原理探索

自定义的异步事件回调机制: 可以在自己的应用程序中,先注册事件和事件对应的回调函数(回调函数可以是函数指针法,虚函数方法的方式);自己程序中每帧检测事件是否发生或者条件是否满足,满足的时候就进入回调函...
  • Blues1021
  • Blues1021
  • 2015年03月15日 12:58
  • 5260

网络get/post请求异步同步请求回调

教你怎么写网络异步同步请求回调最近需要用到请求网络数据,在网上一直查找,都找不到,要么是说的不明白,之后我自己动手来实现了。网络回调,分为同步和异步,多数情况都会用异步,但是也有情况用到同步的。无论同...
  • a136558
  • a136558
  • 2016年05月12日 18:55
  • 1478

使用Guava+Spring实现异步回调操作,提高程序性能

1.关于异步回调      1.Java自带的Future-Callback              随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂。针对于开发人员来说,可...
  • he90227
  • he90227
  • 2016年08月15日 14:43
  • 6419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回调框架 不知道异步可以用不,在尝试
举报原因:
原因补充:

(最多只允许输入30个字)