Java设计模式(十一)--代理模式

简介

所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理对象,来间接的调用实际的对象。

静态代理

静态代理是在编译期间就已经确定好了所需要代理的对象。

抽象类

public interface Base {

    void eat();

}

具体实现类

public class PersonService implements Base {

    public void eat() {
        System.out.println("吃饭");
    }

}

代理类

public class PersonServiceProxy implements Base {

    public Base base;

    public PersonServiceProxy(){
        this.base = new PersonService();
    }

    public void eat() {
        System.out.println("11");
        base.eat();
        System.out.println("22");
    }

}

可以看到在静态代理类中在执行具体方法的之前和之后可以对具体方法进行增强。

测试

public void staticProxy(){
    Base base = new PersonServiceProxy();
    base.eat();
}

我们只需要去创建代理类并调用代理类中的方法,由代理类去调用具体的方法并对方法进行增强。

动态代理

动态代理中所代理的对象不像静态代理一样是固定的,而是在运行期间生成的对象。

代理类

public class PersonServiceProxy implements InvocationHandler {

    private Base base;

    public PersonServiceProxy(Base base){
        this.base = base;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("11");
        return method.invoke(base,args);
    }
}

代理类实现了InvocationHandler接口并重写了invoke方法,在invoke方法中对代理对象进行了增强。

测试

public void dynamicProxy(){
    PersonServiceProxy personServiceProxy = new PersonServiceProxy(new PersonService());
    Base base = (Base) Proxy.newProxyInstance(personServiceProxy.getClass().getClassLoader(),
            new Class[]{Base.class}, personServiceProxy);
    base.eat();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值