java代理模式,静态/动态代理,简单案例实现--柚子真好吃

本文通过生动的场景描述,深入浅出地介绍了Java代理模式的概念及其应用。从静态代理到动态代理,通过具体案例展示了如何使用代理模式来控制对对象的访问。

java代理模式,静态/动态代理,简单案例实现--柚子真好吃

一、代理模式简单介绍

  1. 代理模式其实就是一个中间人/中间商执行业务的过程
  2. 代理模式是一种结构型模式
  3. 代理模式为其他对象提供一种代理以控制对这个对象的访问

二、业务介绍

人物介绍:

  1. 孙小币:公司职员,每日操劳,想寻求刺激。
  2. 条哥:专业按摩师。
  3. 宫燕遵:中间商。
  4. 宫燕军:宫燕遵的哥哥,同样是中间商。

业务流程:
一日,孙小币由于工作特别劳累,故想找专业人员上门服务,但其并不认识条哥。此时孙小币想起了宫燕二兄弟,让其作为中间人,帮忙联系条哥。

三、静态代理

  1. 定义"条宝科技"服务,TBServer.java接口

    public interface TBServer {
    	//上门服务
        public void doorCalls();
    	//收费
        public void getMoney();
    
    }
    
  2. 构建条哥业务,TiaoGe.java

    public class TiaoGe implements TBServer {
    
        @Override
        public void doorCalls() {
            System.out.println("条哥上门服务");
        }
    
        @Override
        public void getMoney() {
            System.out.println("条哥收取服务费");
        }
    }
    
  3. 中间人宫燕遵 GongYanZun.java

    	public class GongYanZun implements TBServer {
        private String name = "宫燕遵";
        private TBServer tbServer;
    
        public GongYanZun(TBServer tbServer){
            this.tbServer = tbServer;
        }
    
        @Override
        public void doorCalls() {
            System.out.println("介绍人:"+this.name+"呼叫条哥上门服务");
            tbServer.doorCalls();
        }
    
        @Override
        public void getMoney() {
            System.out.println("介绍人:"+this.name+"替条哥收取费用");
            System.out.println(this.name+"收取了手续费");
            tbServer.getMoney();
        }
    }
    
  4. 测试类SunXiaoBi.java

    public class SunXiaoBin {
        public static void main(String[] args) {
            TiaoGe tiaoGe = new TiaoGe();
            TBServer tbServer = new GongYanZun(tiaoGe);
            tbServer.doorCalls();
            tbServer.getMoney();
        }
    }
    
  5. 运行结果
    在这里插入图片描述

四、动态代理

  1. 中间人 宫燕军 GongYanJun.java
    public class GongYanJun implements InvocationHandler {
        private String name = "宫燕军";
        private Object target;
    
        public GongYanJun(Object target){
            this.target = target;
        }
    
        public TBServer getProxy() {
            Object obj = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
            return (TBServer)obj;
        }
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before(method.getName());
            Object result = method.invoke(target,args);
            return result;
        }
    
    
        private void before(String methodName) {
            if("doorCalls".equals(methodName)){
                System.out.println("介绍人:"+this.name+"呼叫条哥上门服务");
            }
            if("getMoney".equals(methodName)){
                System.out.println(this.name+"收取了手续费");
            }
        }
    
    }
    
  2. 测试类SunXiaoBi.java
    public class SunXiaoBin {
        public static void main(String[] args) {
            TiaoGe tiaoGe = new TiaoGe();
            TBServer tbServer = new GongYanZun(tiaoGe);
            tbServer.doorCalls();
            tbServer.getMoney();
            System.out.println("===================================");
            TiaoGe tiaoGe2 = new TiaoGe();
            TBServer tbServer2 = new GongYanJun(tiaoGe2).getProxy();
            tbServer2.doorCalls();
            tbServer2.getMoney();
        }
    }
    
  3. 运行结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小金毛

可怜可怜孩子吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值