Java:静态代理

本文介绍了Java中静态代理模式的概念,包括如何创建静态代理类、代理逻辑的封装以及其在实际代码中的应用。同时,文章提到了静态代理的局限性,并与动态代理进行了对比,强调了动态代理在灵活性方面的优势。
摘要由CSDN通过智能技术生成

在Java中,代理模式是一种结构型设计模式,它允许我们通过一个代理对象来间接地访问实际对象。这样做的目的通常是为了在不改变实际对象接口的前提下,添加额外的功能或控制。在Java中,代理主要有两种实现方式:静态代理和动态代理。

静态代理(Static Proxy)

静态代理是在编译时就已经确定的代理关系,它需要开发者手动创建代理类。静态代理通常用于编译时已知的代理关系,或者当代理逻辑较为固定时。

创建静态代理的步骤:
  1. 定义接口:首先,需要定义一个接口,该接口将被实际对象和代理对象共同实现。
  2. 创建代理类:代理类也实现相同的接口,并在其中封装实际对象的引用。代理类中的方法通常会在适当的时候调用实际对象的对应方法,并在调用前后添加额外的行为。
  3. 实现代理逻辑:在代理类中,可以添加额外的逻辑,例如权限检查、日志记录、事务处理等。
  4. 使用代理对象:在客户端代码中,通过代理类实例来代替实际对象的实例,从而实现对实际对象的间接访问。
示例代码一:
// 定义一个接口
public interface ImageLoader {
    void load(String url);
}

// 实际对象
public class RealImageLoader implements ImageLoader {
    @Override
    public void load(String url) {
        System.out.println("RealImageLoader loading image from: " + url);
    }
}

// 代理类
public class ImageLoaderProxy implements ImageLoader {
    private RealImageLoader realImageLoader;

    public ImageLoaderProxy(RealImageLoader realImageLoader) {
        this.realImageLoader = realImageLoader;
    }

    @Override
    public void load(String url) {
        // 代理逻辑
        checkAccess(url);
        // 调用实际对象的方法
        realImageLoader.load(url);
        // 其他代理逻辑
        saveImage(url);
    }

    private void checkAccess(String url) {
        System.out.println("Checking access for: " + url);
    }

    private void saveImage(String url) {
        System.out.println("Saving image from: " + url);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建实际对象
        RealImageLoader realImageLoader = new RealImageLoader();
        // 创建代理对象
        ImageLoaderProxy proxy = new ImageLoaderProxy(realImageLoader);
        // 使用代理对象
        proxy.load("http://example.com/image.jpg");
    }
}

在这个例子中,ImageLoaderProxy是一个静态代理类,它实现了与RealImageLoader相同的ImageLoader接口。客户端代码通过ImageLoaderProxy实例来加载图片,而ImageLoaderProxy内部则调用了RealImageLoader的方法,并在调用前后添加了额外的逻辑。


示例代码二:
package Thread02;

//静态代理模式总结:
    /*
    真实对象和代理对象都要实现同一个接口
    代理对象要代理真实角色
    好处:
        代理对象可以做很多真实对象做不了的事情
        真实对象专注做自己的事情
     */

public class StaticProxy {
    public static void main(String[] args) {
        WeddingCompany weddingCompany=new WeddingCompany(new You());
        weddingCompany.HappyMarry();

    }
}


interface Marry{
    void HappyMarry();
}

//真实角色,you
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("very happy!!");
    }
}

//代理角色
class WeddingCompany implements Marry{
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

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

    private void before() {
        System.out.println("Before--布置");
    }

    private void after() {
        System.out.println("after--收尾款");
    }
}

总结

静态代理是一种简单直接的代理实现方式,但它的缺点是不够灵活。如果需要为多个不同的实际对象创建代理,就需要编写多个代理类,这会增加代码的复杂性。在这种情况下,可以考虑使用动态代理,它允许在运行时动态生成代理类,从而提高代码的可维护性和灵活性。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值