菜鸟的一个学习笔记,欢迎大神 批评指正。
Java多线程相关知识【24】–设计模式–Active Objects设计模式(活动对象设计模式)
1. 问题的引入
当有多个线程要发生交互操作时,其中的一个线程要调用另一个线程的某些方法,并且,可能根据方法的返回值进行进一步的判断。
2. 问题的解决
在这种情况中,我们可以将多个操作方法封装成一个操作方法,让操作者在调用函数时,相当于给这个线程发送了一个命令。
活动对象的设计中,可能用到的方法有:
1. future设计模式
2. 生产者消费者设计模式
3. 工厂模式
4. 代理模式
3. 代码的实现
1. 返回对象
/**
* 结果输出
*/
public interface Result<T> {
/**
* 获取结果
* @return 返回一个结果
*/
T getResultValue();
}
2. 返回对象实现
/**
* 结果输出的实现
* {@link Result}
*/
public class ResultImpl<T> implements Result<T> {
private final T data;
public ResultImpl(T data) {
this.data = data;
}
@Override
public T getResultValue() {
return this.data;
}
}
3. 活动对象指令
/**
* 接受请求的对象
* 相当于设置命令
* {@link Result 实现了相关的返回信息}
*/
public interface ActiveObjects {
/**
* 将一个字符输出输入次
*
* @param times 次数
* @param s 要输出的字符
* @return 制作的字符串
*/
Result makeString(int times, char s);
/**
* 显示一个字符串
*
* @param display 要显示的数据
*/
void displayString(String display);
}
4. 活动对象指令实现
/**
* 实现异步类的接口
* {@link ActiveObjects 实现的接口}
*/
class ActiveObjectsImpl implements ActiveObjects {
@Override
public Result makeString(int times, char s) {
String ans = "";
for (int i = 0; i < times; i++) {
ans += s;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new ResultImpl(ans);
}
@Override
public void displayString(String display) {
System.out.println(display);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
5. 对要进行返回值的使用未来者模式
/**
* 未来者设计模式<br>
* 等待其他进程设置{@link ResultImpl}
*/
public class FutureResult implements Result {
private Result result;
private boolean canUse = false;
/**
* 要设的数据
* @param result 数据
*/
public synchronized void setResult(Result result) {
this.result = result;
this.canUse = true;