设计模式-代理模式

博客介绍了代理模式,它是一种结构型模式,分为静态和动态代理。静态代理由程序员手工创建,动态代理通过反射机制在运行中创建。代理模式可控制对真实对象的访问、增强功能,使用场景包括远程、虚拟、保护代理,还给出了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理模式是一种结构型模式,分为静态代理和动态代理。

  • 静态代理是指由程序员手工创建代理对象;
  • 动态代理是指代理对象是程序在运行过程中采用反射机制动态创建的。

代理模式能够解决哪些问题?

  • 控制客户端对真实对象的访问
  • 对被代理对象添加额外的功能,即功能增强。

代理模式使用场景有哪些?

  • 远程代理
  • 虚拟代理
  • 保护代理

静态代理的示例代码如下:

public interface Subject {
    public void request();
}

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("this is RealSubject");
    }
}

public class StaticProxy implements Subject{

    private Subject target;

    public StaticProxy(Subject target){
        this.target=target;
    }

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

    public void before(){
        System.out.println("前置操作");
    }

    public void after(){
        System.out.println("后置操作");
    }
}

public class StaticProxyTest {
    public static void main(String[] args) {
        Subject sub=new RealSubject();
        StaticProxy staticProxy=new StaticProxy(sub);
        staticProxy.request();
    }
}

动态代理的代码示例如下:

public class DynamicProxy implements InvocationHandler {
    private Subject target;
    public Object getInstance(Subject target){
        this.target=target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object obj=method.invoke(this.target,args);
        after();
        return obj;
    }
    public void before(){
        System.out.println("dynamic proxy before");
    }
    public void after(){
        System.out.println("dynamic proxy after");
    }
}

public class DynamicProxyTest {
    public static void main(String[] args) throws Exception {
        Subject subject=new RealSubject();
        Subject subProxy=(Subject)new DynamicProxy().getInstance(subject);
        subProxy.request();

        byte[] bytes= ProxyGenerator.generateProxyClass("$Proxy0",new Class[]{Subject.class});
        FileOutputStream fos=new FileOutputStream("D://$Proxy0.class");
        fos.write(bytes);
        fos.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值