设计模式之代理模式
程序员文章站
2022-07-01 20:40:50
代理模式来了!先举个例子:在校园里我们经常看到这样一幅情景,某个男生非常喜欢某某女神,但又不好意思直接大胆追求,于是就从女神身边玩得好的人着手,要她们帮忙送吃的,送玩的。。。这样间接地表达自己的心意。 代码实现: 被追求的女神 送礼物的接口 追求者 女神的闺蜜和帮忙做的事 代理模式:为其他对象提供一 ......
代理模式的特点:
- 抽象角色(接口):通过接口或抽象类声明真实角色实现的业务方法(两个类继承自同一个接口)。
- 代理角色(代理类):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色(被代理类):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
在Java多线程中的实现中使用了代理模式。当我们需要开启多线程执行某一项任务时,需要创建一个我们自己定义的被代理类,比如DoWork,它继承自Runnable,并重写run()抽象方法,也就是真实角色所要实现的业务逻辑。系统提供的类Thread也继承自Runnable,同样也实现了run()抽象方法,把DoWork的对象doWork当作参数传入Thread的构造方法中,这时候在Thread实现的run()当中去调用doWork的run()方法,从而实现代理。
一般来说,代理模式都是在代理类(Thread)所实现的抽象方法(run())中去调用被代理类(DoWork)已经实现好的抽象方法(run()),如下图,target就是DoWork的实例。但Thread的对象thread如果直接执行run()方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会开启另外一个线程中执行,还是在主线程里执行,所以这并不是多线程工作。
public class Thread implements Runnable {
// 忽略其他方法......
private Runnable target;
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
而thread调用start()方法,可启动线程并使线程进入就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行thread的run()方法的内容,这是真正的多线程工作。
本文地址:https://blog.csdn.net/lcd493357984/article/details/107419305
上一篇: 深入解析Python中函数的参数与作用域
下一篇: 这50000块钱没白花