静态代理与动态代理Java代码实现

静态代理

代理:顾名思义就是类似于经纪人的角色,当某个导演要找某个演员拍戏的时候,往往会找到这个演员的经纪人(也许不很恰当,不了解饭圈的运作,例子也不是很恰当,当个故事听一听,便于理解),这个经纪人就是代理对象。大明星和经纪人都要实现person接口(共同的接口),经纪人(代理对象)要内部要包含大明星(被代理对象),就是一个简单的代理模式。
在这里插入图片描述

person接口
public interface Person {
	// 表演方法
    void perform(String str);
}

带明星类
public class WomenStar implements Person{

    @Override
    public void perform(String str) {
        System.out.println("参演"+ str + "主角");
    }
}
经纪人类
public class jingjiren implements Person {

	// 要将大明星包进来
    private Person person;
    public jingjiren(Person person){
        super();
        this.person = person;
    }

    @Override
    public void perform(String str) {
        doSomeThingBefore();
        person.perform(str);
        doSomeThingAfter();
    }

    private void doSomeThingBefore(){
        System.out.println("阅读剧本");
    }

    private void doSomeThingAfter(){
        System.out.println("拿到报酬");
    }
}
Main方法
public class Main {
    public static void main(String[] args) {
        Person person = new WomenStar();
        jingjiren fp = new jingjiren(person);
        fp.perform("女");

    }
}

运行结果

在这里插入图片描述

动态代理

静态代理有个问题,如果某大导演是要找另一个明星拍戏,那么就要再找另一位经纪人,这违背了开闭原则(对扩展打开,对修改关闭)。所以我们要使用动态代理。

经纪人类
public class ProxyMai implements InvocationHandler {
    private Object person;
    public void setFactory(Person person){
        this.person = person;

    }
    // 通过proxy获取动态代理的对象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
    }
    // 通过动态代理对象对方法进行增强
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doSomeThingBefore();
        Object ret = method.invoke(person, args);
        doSomeThingAfter();
        return null;
    }
    private void doSomeThingBefore(){
        System.out.println("阅读剧本");
    }
    private void doSomeThingAfter(){
        System.out.println("拿到报酬");
    }
}
改成动态代理类之后,需要哪个明星直接创建该明星类,然后添加进来即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值