【Java】代理模式的理解与Java实现代理模式

代理模式

  1. 什么是代理模式?它是一种设计模式

设计模式有:

  • 装饰者模式
  • 工厂模式
  • 单例模式
  • 建筑者模式
  • 代理模式

等23种模式

  1. 代理模式的背景

    有一个这样的场景:

    比如我是三星手机韩国公司
    我想把我的产品卖个中国的用户(本质的业务)
    怎么做?
    我通过我自己去卖给中国的用户是不是太麻烦又太陌生了
    所以这个时候我们要找一个比较熟悉中国市场的代理商
    找代理商
    我们可以通过代理商将我们的产品卖个中国的用户(业务的代理)
    

    由此我们引入代理模式

  2. 在Java中如何去实现一个代理模式呢?

    抽象业务

    package org.skyme.proxy;
    
    /*
    这里是我要实现的业务接口
     */
    public interface SellService {
        public String sell(String country);
    }
    
    

    具体业务

    package org.skyme.proxy;
    
    /**
     * @author:Skyme
     * @create: 2023-09-13 22:50
     * @Description:实现具体业务
     */
    public class SellServiceImpl implements SellService{
        @Override
        public String sell(String country) {
            System.out.println("产品卖给了"+country);
            return "具体业务成功执行";
        }
    }
    
    

    业务都有了,那么我们现在干什么?

    那就是怎么将业务交给代理商

    package org.skyme.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * @author:Skyme
     * @create: 2023-09-13 22:53
     * @Description:
     */
    
    public class ProxyServiceHandler implements InvocationHandler {
        //具体业务类
        private Object object;
    
        public ProxyServiceHandler(Object object) {
            this.object = object;
        }
        //做代理了
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //proxy是代理商,method是要代理的业务,args是业务中的参数(相当于我要去卖产品,产品有哪些要卖的)
            //在这之前可以做一些事情
            //比如说,我要调查整个国家的市场
            String res = (String)method.invoke(object, args);
            //在这之后可以做一些事情
            //比如反馈结果给公司总部
            return res;
        }
    
    }
    
    

    怎么交付有了,那么怎么去代理呢?

    package org.skyme.proxy;
    
    import java.lang.reflect.Proxy;
    
    /**
     * @author:Skyme
     * @create: 2023-09-13 22:58
     * @Description:
     */
    public class ProxyTest {
        public static void main(String[] args) {
            SellService sell=new SellServiceImpl();
            ProxyServiceHandler proxyServiceHandler = new ProxyServiceHandler(sell);
            SellService o = (SellService)Proxy.newProxyInstance(sell.getClass().getClassLoader(), 	sell.getClass().getInterfaces(), proxyServiceHandler);
            System.out.println(o.getClass().getName());
            String china = o.sell("China");
            System.out.println(china);
        }
    }
    
    

    怎么去理解?

    首先我业务先出来,然后我要交付给代理商,那么我这里相当于实现了代理商是怎么样的,然后怎么交付的,代理商要做什么

    这里是具体业务:

    SellService sell=new SellServiceImpl();
    

    这里是代理商以及交付给代理商去实现

    ProxyServiceHandler proxyServiceHandler = new ProxyServiceHandler(sell);
    

    这里是给出真正的代理商

     SellService o = (SellService)Proxy.newProxyInstance(sell.getClass().getClassLoader(), 	sell.getClass().getInterfaces(), proxyServiceHandler);
    

    真正的代理商执行方法:

      String china = o.sell("China");
    

总结

就是我们其实并不关心代理商到底是谁,·而我们作为总部只需要去关心到底是怎么代理的业务,通俗一点来说就是我去看下你这个代理的业务行得通不,我可以跟你说下一些怎么实现业务等等,所以代理模式很像装饰者,装饰者模式是对一个业务的优化增强,而代理模式呢是对业务的拓展

装饰者模式更强调自身

代理模式更强调代理商要做的业务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值