静态代理

代理就是通过代理对象去访问实际的目标对象,比如结婚,婚庆公司就是代理类,而结婚的人就是需被代理的对象;代理类不仅可以实现目标对象,还可以增加一些额外的功能

静态代理指代码运行前,代理类就已经存在,先创建一个代理的接口如Marry

interface Marry{
    void HappyMarry();
}

再定义一个所需代理的对象,及需要结婚的人

class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("结婚咯");
    }
}

需要写一个代理类,及婚庆公司

class WeddingCompany implements Marry{
    //新建一个结婚接口对象
    private Marry target;
    //将主函数形参的所需静态代理的对象传到WeddingCompany函数里,再通过构造函数传给私有对象
    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("结婚后");
    }

    private void before() {
        System.out.println("结婚前");
    }
}

再创建主函数,在代理类可以在不更改被代理对象的时候去增加功能

public class StaticProxy{
    public static void main(String[] args) {
        /*
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        等价于
        You you = new You
        WeddingCompany weddingCompany = new WeddingCompany(you);
        括号内为所静态代理的对象
         */
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        weddingCompany.HappyMarry();
    }
}

因为静态代理在代码运行之前就已经存在代理类了,所以每一个代理对象都需要去建一个代理类去代理,当需要代理的对象有很多时,就需要创建很多的代理类,降低了程序可维护性。

完整实现代码

package com.cz.demo4;

/**
 * @author 卓亦苇
 * @version 1.0
 * 2023/2/22 22:29
 */
public class StaticProxy{
    public static void main(String[] args) {
        /*
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        等价于
        You you = new You
        WeddingCompany weddingCompany = new WeddingCompany(you);
        括号内为所静态代理的对象
         */
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        weddingCompany.HappyMarry();
    }
}
interface Marry{
    void HappyMarry();
}
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("结婚咯");
    }
}
class WeddingCompany implements Marry{
    //新建一个结婚接口对象
    private Marry target;
    //将主函数形参的所需静态代理的对象传到WeddingCompany函数里,再通过构造函数传给私有对象
    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("结婚后");
    }

    private void before() {
        System.out.println("结婚前");
    }
}
posted @   卓亦苇  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示