场景回调

一个简单的场景:老板与雇员的故事,老板给雇员打电话去干某事,雇员干完之后把结果反馈给老板。

用代码模拟一下上述的场景。

简单分析一下:有2个对象 :老板 (boss)与 雇员(employee) 

‘老板给雇员打电话 去干某事’:抽象一下 就是 ‘boss让employee去干某事‘,而boss能够让employee去干一些事情,就说明对象boss中必定持有对象employee;其中boss有方法makePhone(),在makephone()方法让employee去doSomething()。

boss能够给employee打电话,那employee如何告知boss他做事情的结果呢。可能会这样想,让employee持有boss的引用不就好了,这种方式暂缓,还没想明白。

从打电话的角度来看,boss能够给employee打电话,说明boss持有employee的电话号码,也就相当于持有了employee对象,然后给employee打电话去干某事,相当于boss把自己的电话号码暴露给了employee。于是,在employee去doSomething()方法总需要2个参数,一个是把自己的电话号码暴露给employee(也就是this),另外一个是干什么事情。

'雇员干完之后把结果反馈给老板':

先是前半段:雇员干完事情得到结果,很简单:雇员自己的一个方法比如analyse(thing),接收XX事情,然后返回一个结果。

后半段:把结果反馈给老板   这里就用到了之前传递过来的this参数,让他自己把结果取回去。


Employee 类

public class Employee {

	/**
	 * Employee 分析事情得到结果,通过boss暴露过来的电话号码把结果传递回去
	 * @param boss
	 * @param thing
	 */
	public void doSomeThing(Boss boss, String thing) {
		System.out.println("Employee开始处理事情:"+thing);
		String result = analyse(thing);
		System.out.println("Employee事情处理结束:"+thing);
		feedBack(boss,result);
	}

	/**
	 * Employee 通过boss暴露过来的电话号码把结果传递回去
	 * @param boss
	 * @param result
	 */
	private void feedBack(Boss boss,String result) {
		boss.notified(result);
	}

	/**
	 * 分析事情得到结果
	 * @param thing
	 * @return
	 */
	private String  analyse(String thing) {
		System.out.println("Employee正在处理事情:"+thing);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		String result = "结果XXX";
		return result;
	}
	
}


Boss 类

/**
 * Boss很牛  持有empleyee的电话号码
 * @author Administrator
 *
 */
public class Boss {
	private Employee empleyee;
	public Boss(Employee empleyee){
		this.empleyee = empleyee;
	}
	
	/**
	 * 打电话告诉employee去处理事情
	 */
	void makePhone(){
		String thing = "事情XX";
		System.out.println("Boss通知empleyee去处理事情:"+thing);
		//把自己的电话号码暴露给了employee
		empleyee.doSomeThing(this,thing);
	}
	
	/**
	 * 需要一个被通知的方法
	 */
	void notified(String result){
		System.out.println("Boss反馈得到的结果: "+result);
	}
}


测试的Testmain.java

public class Testmain {

	public static void main(String[] args) {
		Employee employee = new Employee();
		Boss boss =  new Boss(employee);
		boss.makePhone();
	}

}

以上3个类能够完整的实现场景的需求。

但是在Boss 类中定义notified(),然后在employee中调用传递过来的boss.notified() 感觉怪怪的,一点都不优雅。


重新审视代码 发现在Boss的构造函数中,强制性的传入Employee对象。

这里可以改一下Boss的构造函数,同时加一个setEmployee()方法。

        private Employee empleyee;
	public Boss(){
	}
	public void setEmployee(Employee empleyee){
		this.empleyee = empleyee;
	}


这些改好之后,为了程序能够继续测试,在改一改Testmain.java文件中的程序吧

public static void main(String[] args) {
		Employee employee = new Employee();
		Boss boss =  new Boss();
		boss.setEmployee(employee);
		boss.makePhone();
	}

好了,程序可以测试一下了。能够输出正常结果

这个时候考虑一下为什么



是因为在设计Boss类的时候,强制性的把Employee对象放在构造方法中。

于是,可以这么改一下


有没有一种方式可以不通过









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值