当前位置:首页 » 《随便一记》 » 正文

Java 代理模式

7 人参与  2022年11月07日 14:17  分类 : 《随便一记》  评论

点击全文阅读


代理模式分为静态代理和动态代理

静态代理

介绍

类似于生活中的中介代理房东租房、婚介代理要结婚的情侣布置婚礼现场等等。

实现

拿房东租房为例

Rent接口

package com.curtian.study.static_proxy.demo1;public interface Rent {    void rent();}

Rent接口的第一个实现类,房东

package com.curtian.study.static_proxy.demo1;/** * 房东 */public class Host implements Rent{    @Override    public void rent() {        System.out.println("房东租房子");    }}

Rent接口的第二个实现类,中介

package com.curtian.study.static_proxy.demo1;public class Proxy implements Rent{    private Host host;    @Override    public void rent() {        seeHouse();        host.rent();        hetong();        rate();    }    public Proxy(Host host) {        this.host = host;    }    private void seeHouse(){        System.out.println("中介带看房子");    }    private void hetong(){        System.out.println("签署租赁合同");    }    private void rate(){        System.out.println("收取中介费");    }}

从代码中我们也可以发现,中介只是在被代理的类的方法上加了一些额外的方法(seeHouse、hetong、rate)

静态代理总结

接口(Rent租房接口)真实角色(Host房东)代理角色(Proxy房屋中介)组成。

好处

是可以是使真实角色操作更加存粹(房东只管租房一件事情),很明显的体现了面向对象七大原则的单一职责原则。公共业务就交给代理角色。

缺点

一个真实角色就对应一个代理角色,比如房东对应房屋中介、要结婚的情侣对应婚介所

动态代理

介绍

拥有静态代理的所有优点以及可以动态生成代理类。

分类

动态代理分为三大类:

基于接口的:jdk动态代理基于类的:cglibjava字节码实现的:javasist

JDK动态代理

(目前博主只了解了jdk动态代理)

JDK动态代理核心

Proxy类InvocationHandler接口
Proxy用于生成代理类,实现InvocationHandler接口可以通过反射获取被代理的类的方法, 然后在此基础上添加一些附属操作

举例

给所有类的方法加一些日志。

UserService接口

package com.curtian.study.static_proxy.demo2;public interface Userservice {    void add();    void delete();}

UserServiceImpl类

package com.curtian.study.static_proxy.demo2;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements Userservice{    @Override    public void add() {        System.out.println("加法");    }    @Override    public void delete() {        System.out.println("减法");    }}

ProxyInvocationHandler(核心)

package com.curtian.study.dynamic_proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyInvocationHandler implements InvocationHandler {    //被代理的对象    private Object target;    public void setTarget(Object target){        this.target = target;    }    /**     * 生成代理类     * @return     */    public Object getProxy(){        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }    /**     * 当代理类执行方法的时候,会回调到这个方法,附属操作也是在这里加的     * @param proxy     * @param method     * @param args     * @return     * @throws Throwable     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println(proxy.getClass().getName());        log("调用了" + method.getName() + "方法");        return method.invoke(target, args);    }    private void log(String msg){        System.out.println(msg);    }}

Test(测试)

/** * 动态代理 * 介绍:动态代理和静态代理角色一样 * 动态代理的代理类是动态生成的,不是我们直接写好的! * 动态代理分为两大类:基于接口的动态代理,基于类的动态代理。 *      1.基于接口--Jdk动态代理【本次示例】 *      2.基于类:cglib *      3.java字节码实现: javasist * 示例中的两个核心类/接口,Proxy类、invocationHandler接口 * * */public class Main {    public static void main(String[] args) {        UserServiceImpl userService = new UserServiceImpl();        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();        proxyInvocationHandler.setTarget(userService);        Userservice proxy = (Userservice) proxyInvocationHandler.getProxy();        proxy.add();        proxy.delete();    }}

运行情况:
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/47258.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 《笨蛋美人重生八零,硬汉军官狂宠》免费阅读_江晚瑜沈裴竣小说免费试读
  • 《笨蛋美人重生八零,硬汉军官狂宠》江晚瑜沈裴竣章节目录免费阅读
  • 她的记忆停留在了最爱初恋的那年许欣柔楚临川完本_她的记忆停留在了最爱初恋的那年(许欣柔楚临川)
  • 全书浏览假千金的实习生男友霸占我办公室,我反手让他们倾家荡产(顾家明)_假千金的实习生男友霸占我办公室,我反手让他们倾家荡产(顾家明)全书结局
  • 童养夫让我给他的新欢出修复费(林嘉芝林思雅)_童养夫让我给他的新欢出修复费林嘉芝林思雅
  • 全文资助生女婿让我给他白月光付三千万月子中心钱(宋清玉宋雅)列表_全文资助生女婿让我给他白月光付三千万月子中心钱
  • 碎在时光里的谎言喻景宴秦明月完本_碎在时光里的谎言(喻景宴秦明月)
  • 旧爱剜心吻成灰席鄢之岑秋全书免费旧爱剜心吻成灰席鄢之岑秋全书免费
  • 结婚六年丈夫不碰我谁知儿子亲爹是寡头(纪清言傅司砚),结婚六年丈夫不碰我谁知儿子亲爹是寡头
  • 老公想换掉我的男胎,我笑他自不量力(宋薇于继业)_老公想换掉我的男胎,我笑他自不量力宋薇于继业
  • 给太子下了噬心蛊后,皇后找上门(小夭赵劼)全书浏览_给太子下了噬心蛊后,皇后找上门全书浏览
  • 豪门绝嗣!带球跑的夫人回来了!(谢长宴慕清杳)_豪门绝嗣!带球跑的夫人回来了!谢长宴慕清杳

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1