欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之代理模式

程序员文章站 2022-04-11 21:11:37
代理模式来了!先举个例子:在校园里我们经常看到这样一幅情景,某个男生非常喜欢某某女神,但又不好意思直接大胆追求,于是就从女神身边玩得好的人着手,要她们帮忙送吃的,送玩的。。。这样间接地表达自己的心意。 代码实现: 被追求的女神 送礼物的接口 追求者 女神的闺蜜和帮忙做的事 代理模式:为其他对象提供一 ......

代理模式的特点:

  1. 抽象角色(接口):通过接口或抽象类声明真实角色实现的业务方法(两个类继承自同一个接口)。
  2. 代理角色(代理类):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  3. 真实角色(被代理类):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

在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