java中静态代理模式

什么是代理模式

 比如说一个人结婚,按理说他结婚该做的事情应该全部都由他做。但是在真实案例中往往不是这样的,结婚的人把结婚前后一些事情委托给婚庆公司解决,自己只需要做 “最重要” 的部分就好了。

需要注意的事情

timg 1.jpg

  1. 用户只需要关注接口提供的功能,而不需要知到谁提供的功能
  2. 用户(Subject)调用Proxy,Proxy内调用RealSubject。
  3. Proxy是作为一个中间的存在,可以在调用真实方法前后做一些其它业务。它是对RealSubject做了增强操作。

通过代码分析静态代理

 该案例通过 我结婚 和 婚庆公司之间举例。

  1. 创建结婚接口
interface Marry{
    // 结婚
    void married();
}
  1. 创建 真实的角色并实现Marry接口
class Me implements Marry{

    @Override
    public void married() {
        System.out.println("我结婚了");
    }
}
  1. 创建代理类
class MarryProxy implements Marry{

    private Marry marry;

    // 构造函数接受一个Marry实现类
    public MarryProxy(Marry marry){
        this.marry = marry;
    }


    @Override
    public void married() {
        before();

	// 通过接受的实现类调用方法
        marry.married();

        after();
    }

    public void after(){
        System.out.println("结婚后收取尾款");
    }
    public void before(){
        System.out.println("结婚前布置会场");
    }
}

  1. 在main中通过代理类实现方法
    public static void main(String[] args) {
        Me me = new Me();

        MarryProxy marryProxy = new MarryProxy(me);
        marryProxy.married();
	// 可以简写为
	// new MarryProxy(me).married();
    }

发现

 通过案例中的第4步发现,创建一个Me()对象,而在同过Me()对象创建代理类,最后实现最终的目的。这跟我们创建线程的时候很像。
 我们在创建线程的时候代码如下

     new Thread(new MyThread()).start();

 所以不要怀疑,创建线程中就是用的代理模式

最终代码

package com.springboot3.springcloud.Thread;

import com.sun.org.apache.xpath.internal.operations.Bool;

import java.util.concurrent.*;

/**
 * @author 
 * @date 2020/7/31
 **/
public class TestThread {
    public static void main(String[] args) {
        Me me = new Me();
        MarryProxy marryProxy = new MarryProxy(me);
        marryProxy.married();
       // 简写
       // new MarryProxy(me).married();
        
    }
}

interface Marry{
    // 结婚中
    void married();
}

class Me implements Marry{

    @Override
    public void married() {
        System.out.println("我结婚了");
    }

}

class MarryProxy implements Marry{
    private Marry marry;

    public MarryProxy(Marry marry){
        this.marry = marry;
    }


    @Override
    public void married() {
        before();
        marry.married();
        after();
    }

    public void after(){
        System.out.println("结婚后收取尾款");
    }
    public void before(){
        System.out.println("结婚前布置会场");
    }
}


# 多线程 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×