一个简单的场景:老板与雇员的故事,老板给雇员打电话去干某事,雇员干完之后把结果反馈给老板。
用代码模拟一下上述的场景。
简单分析一下:有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对象放在构造方法中。
于是,可以这么改一下
有没有一种方式可以不通过