代理模式(静态代理、动态代理)

1.声明:
(1) 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
(2) 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

2.静态代理模式的弊端:
1. 已经把代理类写死,倒置每个被代理类都需要一个对应代理类,造成代码冗余

package reflection;


interface proceFactrory {
    void doJob();
}
public class proceFactroryTest {
    public static void main(String[] args) {
        proced proced1 = new proced();

        proceFactrory proced = new proceFactrory1(proced1);
        proced.doJob();
    }
}
//代理类
class proceFactrory1 implements proceFactrory {
    private proced man;
    public proceFactrory1(proced man){
        this.man = man;
    }
    @Override
    public void doJob() {
        System.out.println("项目开始");
        man.doJob();
        System.out.println("项目结束");
    }
}
    //    被代理类
    class proced implements proceFactrory {
        @Override
        public void doJob() {
            System.out.println("这个人做的项目很好");
        }
    }

动态代理

package reflection;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description:
 * @Author:王工
 * @Package:reflection
 * @Project:javase
 * @name:moveProceFactroryTest
 * @Date:2023/3/5 17:05
 */
public class moveProceFactroryTest {
    public static void main(String[] args) {
        man man = new man();
        human northhuman = (human) proce.returnProce(man);
        northhuman.eat("喜欢喝羊肉汤");
        String name = northhuman.name();
        System.out.println(name);
    }
}

interface human {
    String name();

    void eat(String food);
}
class man implements human{

    @Override
    public String name() {

        return "北方人";
    }

    @Override
    public void eat(String food) {
        System.out.println(food);


    }
}


class proce {
    public static Object returnProce(Object obj) {
//        创建实现类的对象,便于作为参数找到对象所属类,进而调用对应的invoke()
        myInvocationHandler myInvocationHandler = new myInvocationHandler(obj);
//        根据obj对象确定代理类和代理类的类加载器、实现的接口相同
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),myInvocationHandler);
    }

}
class myInvocationHandler implements InvocationHandler {
    private Object obj;
    public myInvocationHandler(Object obj){
        this.obj = obj;
    }
//    被代理类需要实现的业务写在invoke方法中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(obj, args);
        return invoke;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值