Java教程

java代理模式

本文主要是介绍java代理模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • 一、代理模式
    • 组成:
  • 二、静态代理
    • 1.类结构图
    • 2.代码示例
      • Person接口
      • Student(被代理)类
      • SquadLeader(代理)类
    • 3.测试
      • 测试类
      • 运行结果
  • 三、动态代理
    • 1.类结构图
    • 2.代码示例
      • Star接口
      • ChinaStar(被代理)类
      • DynamicProxy(动态代理)类
    • 3.测试
      • 测试类
      • 运行结果

一、代理模式

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

组成:

  • 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

二、静态代理

1.类结构图

静态代理类结构图

2.代码示例

Person接口

public interface Person {
    void giveMoney();// 交费
}

Student(被代理)类

public class Student implements Person {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    @Override
    public void giveMoney() {
        System.out.println(name + "上交班费100元");
    }
}

SquadLeader(代理)类

public class SquadLeader implements Person {
    private Student stu;

    public SquadLeader(Person stu) {
        if (stu instanceof Student) {
            this.stu = (Student) stu;
        }
    }

    @Override
    public void giveMoney() {
        System.out.println("班长收班费");
        stu.giveMoney();
        System.out.println("班长上交班费");
    }
}

3.测试

测试类

public class StaticProxyTest {
    public static void main(String[] args) {
        Student zs = new Student("张三");// 创建学生(被代理)类
        SquadLeader squadLeader = new SquadLeader(zs);// 创建班长(代理)类
        squadLeader.giveMoney();// 班长代上交班费
    }
}

运行结果

班长收班费
张三上交班费100元
班长上交班费

三、动态代理

1.类结构图

在这里插入图片描述

2.代码示例

Star接口

public interface Star {
    void sing(String name);
    void dance(String name);
}

ChinaStar(被代理)类

public class ChinaStar implements Star {
    private String name;

    public ChinaStar(String name) {
        this.name = name;
    }

    @Override
    public void sing(String name) {
        System.out.println(this.name + "唱了一首:" + name);
    }

    @Override
    public void dance(String name) {
        System.out.println(this.name + "跳了一段:" + name);
    }
}

DynamicProxy(动态代理)类

public class DynamicProxy<T> implements InvocationHandler {
    private T target;

    // 设置被代理的对象
    public void setTarget(T target) {
        this.target = target;
    }
    // 创建代理对象
    public T creatProxy() throws Exception {
        Objects.requireNonNull(target,"请先设置被代理对象");
        return (T) Proxy.newProxyInstance(target.getClass().
        getClassLoader(),target.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object invoke = method.invoke(target, args);
        after();
        return invoke;
    }
    private void before() {
        System.out.println("准备工作");
    }
    private void after() {
        System.out.println("收尾工作");
    }
}

3.测试

测试类

public class DynamicProxyTest {
    public static void main(String[] args) throws Throwable {
        // 三个被代理对象
        ChinaStar liRongHao = new ChinaStar("李荣浩");
        ChinaStar zhouJieLun = new ChinaStar("蔡徐坤");
        Student zhangSan = new Student("张三");
        // 一个动态代理类
        DynamicProxy dynamicProxy = new DynamicProxy();
        // 明星代理类
        dynamicProxy.setTarget(liRongHao);
        Star star = (Star) dynamicProxy.creatProxy();
        star.sing("年少有为");
        System.out.println("******************************");
        dynamicProxy.setTarget(zhouJieLun);
        star =  (Star) dynamicProxy.creatProxy();
        star.dance("鸡你太美");
        System.out.println("******************************");
        // 学生代理类
        dynamicProxy.setTarget(zhangSan);
        Person person = (Person) dynamicProxy.creatProxy();
        person.giveMoney();
    }
}

运行结果

准备工作
李荣浩唱了一首:年少有为
收尾工作
******************************
准备工作
蔡徐坤跳了一段:鸡你太美
收尾工作
******************************
准备工作
张三上交班费100元
收尾工作
这篇关于java代理模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!