深圳服装网站建设制作开发贵阳小程序开发软件公司

diannao/2025/10/25 10:52:11/文章来源:
深圳服装网站建设制作开发,贵阳小程序开发软件公司,网站建设具体步骤,营销推广活动策划方案静态代理设计模式 代理设计模式最本质的特质#xff1a;一个真实业务主题只完成核心操作#xff0c;而所有与之辅助的功能都由代理类来完成。 例如#xff0c;在进行数据库更新的过程之中#xff0c;事务处理必须起作用#xff0c;所以此时就可以编写代理设计模式来完成。…静态代理设计模式 代理设计模式最本质的特质一个真实业务主题只完成核心操作而所有与之辅助的功能都由代理类来完成。   例如在进行数据库更新的过程之中事务处理必须起作用所以此时就可以编写代理设计模式来完成。   范例结合传统的代理设计模式以及以购物车CartDao为例来编写代理设计模式 package so.strong.mall.proxy; import java.util.List; public interface CartDao {boolean insert(Cart cart) throws Exception;ListCart findAll() throws Exception; } 以上CartDao接口定义的方法更行插入一定需要事务控制对于查询操作不需要事务控制。   定义CartDao真实实现 package so.strong.mall.proxy; import java.util.List; public class CartDAOImpl implements CartDao{Overridepublic boolean insert(Cart cart) throws Exception {System.out.println(执行数据增加操作);return false;}Overridepublic ListCart findAll() throws Exception {System.out.println(执行数据列表操作);return null;} }   定义代理主题类 package so.strong.mall.proxy; import java.util.List; public class CartDAOProxy implements CartDao {private CartDao cartDao;public CartDAOProxy() {}public void setCartDao(CartDao cartDao) {this.cartDao cartDao;}public void prepare() {System.out.println(取消掉jdbc的自动提交);}public void commit() {System.out.println(手工提交事务);}public void rollback() {System.out.println(出现错误事务回滚);}Overridepublic boolean insert(Cart cart) throws Exception {try {this.prepare();boolean flag this.cartDao.insert(cart);this.commit();return flag;} catch (Exception e) {this.rollback();throw e;}}Overridepublic ListCart findAll() throws Exception {return this.cartDao.findAll();} }   业务层现在并不关心到底是代理类还是真实主题类它只关心一点只要取得了CartDao接口对象就可以那么这一操作可以通过工厂类来隐藏。 package so.strong.mall.proxy; public class DAOFactory {public static CartDao getCartDaoInstance() {CartDAOProxy proxy new CartDAOProxy();proxy.setCartDao(new CartDAOImpl());return proxy;} } 此时业务层暂时不需要继续进行只需要通过客户端模拟业务层调用即可。 public class TestDemo { public static void main(String[] args) throws Exception{CartDao dao DAOFactory.getCartDaoInstance();dao.insert(new Cart());} } //取消掉jdbc的自动提交 //执行数据增加操作 //手工提交事务 因为事务和处理本身与核心业务有关的功能但是它不是核心那么用代理解决是最合适的方式。   动态代理设计模式 上面给出的代理设计模式的确可以完成代理要求但是有一个问题如果说现在项目里面有200张数据表那么至少也需要200个左右的DAO接口如果用上面的代理设计模式那么意味着除了编写200个的DAO接口实现还要编写200个代理类并且有意思的是这些代理类实现几乎相同。 以上的代理设计模式属于静态代理设计模式只能够作为代理模式的雏形出现并不能购作为代码使用的设计模式为此专门引入了动态代理设计模式的概念。 即利用一个代理类可以实现所有被代理的操作。   如果要想实现动态设计模式那么必须首先观察一个接口java.lang.reflect.InvocatonHandler.   它里面有一个方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; 这个方法就属于代理中调用真实主题类的操作方法这个方法里面的参数意义如下 Object proxy表示代理类的对象Method method表示现在正在调用的方法Object[] args表示方法里面的参数。但是这个方法没有所对应的真实对象所以需要在创建这个类对象的时候设置好真实代理对象。   如果要想找到代理对象则要使用java.lang.reflect.Proxy类来动态创建此类主要使用以下方法 public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h) throws IllegalArgumentException 此方法参数定义如下 ClassLoader loader 指的是取得对象的加载器Class?[] interfaces 代理设计模式的核心是围绕接口进行的所以此处必须取出全部的接口InvocationHandler h代理的实现类。  范例使用动态代理实现上面的代理 CartDao不变修改CartDAOProxy代理类 package so.strong.mall.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class CartDAOProxy implements InvocationHandler {private Object obj; //这个是真实对象主题/*** 将要操作的真实主题对象绑定到代理之中而后返回一个代理类对象* param obj 真实对象主题* return 代理类对象*/public Object bind(Object obj) {this.obj obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);}public void prepare() {System.out.println(取消掉jdbc的自动提交);}public void commit() {System.out.println(手工提交事务);}public void rollback() {System.out.println(出现错误事务回滚);}//只要执行了操作方法那么就一定会触发invokeOverridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object object null;//接收返回值if (method.getName().contains(insert)) { //更新插入类操作this.prepare();try {object method.invoke(this.obj, args); //反射调用方法this.commit();} catch (Exception e) {this.rollback();}} else {object method.invoke(this.obj, args);//查询操作不需要事务支持}return object;} } //修改工厂 package so.strong.mall.proxy; public class DAOFactory {public static Object getCartDaoInstance(Object realObject) {return new CartDAOProxy().bind(realObject);} } //修改调用 package so.strong.mall.proxy; public class TestDemo {public static void main(String[] args) throws Exception{CartDao dao (CartDao) DAOFactory.getCartDaoInstance(new CartDAOImpl());dao.insert(new Cart());} }   CGLIB实现动态代理设计模式 动态代理模式的确好用而且也解决了代理类重复的问题但是不管是传统静态代理或动态代理都有个设计缺陷以动态代理为例 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); //传入真实主题类返回代理主题类 代理设计模式有一个硬性要求就是类必须要有接口所以业界很多人认为应该在没有接口的环境下也能使用代理设计模式。 所以在此时在开源社区里面提供了一个组件包——CGLIB利用此包可以在没有接口的情况下也能够使用动态代理设计模式它是模拟的类。 如果要想使用CGLIB那么必须首先搞清楚对应关系 Proxynet.sf.cglib.proxy.EnhancerInvocationHandlernet.sf.cglib.proxy.MethodInterceptor真实主题调用net.sf.cglib.proxy.MethodProxy老师课上使用的是引入CGLIB的jar包我去mvn仓库找了一下找到了一个cglib放到pom里面发现也可以。 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion2.2.2/version /dependency   范例使用CGLIB实现动态代理设计模式 package so.strong.mall.proxy; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;class ItemDAOImpl {public void insert(Item item) {System.out.println(增加操作);} }class MyProxy implements MethodInterceptor {private Object target; //真实操作主题public MyProxy(Object target) {this.target target;}Overridepublic Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {Object object null;this.prepare();object method.invoke(this.target, args);this.commit();return object;}public void prepare() {System.out.println(取消掉jdbc的自动提交);}public void commit() {System.out.println(手工提交事务);} }public class TestCGLIB {public static void main(String[] args) {ItemDAOImpl itemDAO new ItemDAOImpl(); //真实主题对象//代理设计模式之中必须要有公共的集合点例如接口而CGLIB没有接口Enhancer enhancer new Enhancer(); //创建一个代理工具类enhancer.setSuperclass(ItemDAOImpl.class); //设置一个虚拟的父类enhancer.setCallback(new MyProxy(itemDAO)); //设置代理的回调操作ItemDAOImpl proxyDao (ItemDAOImpl) enhancer.create();proxyDao.insert(new Item());} } 可以发现此时没有了对接口的依赖也可以实现动态代理设计但是需要模拟代理的父类对象。转载于:https://www.cnblogs.com/itermis/p/8940582.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈尔滨模板做网站设计一套网站费用

大家好我是小峰,今天我们开始学习二叉树。 首先我们来学习什么是树? 树概念及结构 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的…

潍坊网站排名推广网页浏览器推荐

系列文章使用 abp cli 搭建项目给项目瘦身,让它跑起来完善与美化,Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API,包装返回模型再说Swagger,分组、描述、小绿锁接入GitHub,用JWT保护你的API异常处理和…

济宁高端网站建设wordpress为什么性能差

默认情况下,springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件,如果我们希望再定义一个独立的配置文件用来配置特定业务数据,而不希望把这些配置内容都堆积在 application 配置文件中,实现这个需…

阿里巴巴网站怎么做全屏大图网站建设费用包括哪些内容

题目: 如图6-8所示,可以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列个分城两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的取余全白或全黑,则直…

莉莉卡是哪个网站做的windows搭建网站开发

资料: 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:陈禹鲁 链接:http://www.zhihu.com/question/19809484/answer/35544452 来源:知乎 第一本,入门 《Head first HTML&…

网站建设制作设计推广优化初学者怎么制作平面图

高精度加法 1.题目2.基本思想3.代码实现4.总结 1.题目 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的和。 数据范围 1 ≤ 整数长度 ≤ 100000 1≤整…

网站备案添加域名邢台移动端网站建设

随着科技的飞速发展,人工智能(AI)已经从科幻小说中的概念变成了现实生活中的重要角色。AI大模型技术,作为人工智能领域的一项重要突破,如今已不再是一个新鲜词汇,而是正在深刻改变着我们的生活方式和工作模…

商城网站建设都有哪些类型大学高校网站建设栏目

目录 ACM金牌带你零基础直达C语言精通-课程资料 一.作用域的基本概念 二.函数 1. 函数的定义和使用 2.为什么一定要有函数结构 3.形参与实参 4.函数的声明和定义 5.递归函数 此代码中递归函数执行流程: 练习:求斐波那契数列第n项的值: 欧几里…

广州网站建设公司万齐网络科技html网站免费模板下载

本章概要 测试驱动开发 测试驱动 vs 测试优先 日志 日志信息日志等级 测试驱动开发 之所以可以有测试驱动开发(TDD)这种开发方式,是因为如果你在设计和编写代码时考虑到了测试,那么你不仅可以写出可测试性更好的代码&#xff…

网页设计素材图片黑白电脑优化系统的软件哪个好

java 泛型和类型擦除“编译期间擦除泛型”是常识&#xff08;好吧&#xff0c;类型参数和实参实际上是被擦除的&#xff09;。 这是由于“类型擦除”而发生的。 但这是错误的&#xff0c;正如许多开发人员所假设的那样&#xff0c;将<..>符号内指定的所有内容都删除了。 …

濮阳市网站怎么做宣传推荐做网站的话术

思科设备SSH登陆详细配置过程我们用GNS3进行拓扑搭建。实验拓扑图如下&#xff1a;进行完基本配置之后开始配置SSH服务器(R2)1.首先验证设备是否支持SSHR2#show ip ssh能够识别这条命令就说明支持。2.配置IP域名。使用config# ip domain-name domain-name全局配置模式命令配置网…

网站广告位有哪些网站二级目录怎么做

1. 类 1.1. 简介 TypeScript是面向对象的JavaScript。   类描述了所创建的对象共同的属性与方法。 1.2. 类的定义 class class_name { // 类作用域 }&#xff08;1&#xff09;定义类的关键字是class&#xff0c;后面紧跟类名&#xff0c;类可以包含以下几个模块&#xff…

光明新区城市建设局网站做网站要注册公司吗

1、考虑下列三种情况下&#xff0c;对比一下普通RNN的表现和LSTM和GRU表现&#xff1a; &#xff08;1&#xff09;早期观测值对预测未来观测者具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c; 目标是在序列的末尾辨别校验和是…

自己有网站怎么推广wordpress网站设密码

线程组&#xff08; Threads &#xff08;Users&#xff09;&#xff09;理解&#xff1a;一个虚拟用户组&#xff0c;线程组内线程数量在运行过程中不会发生改变。 注意事项&#xff1a;线程间变量相互独立。 一个测试计划内可以包含多个线程组。 可定义内容&#xff1a; 取样…

建设网站公司浩森宇特深圳在建高铁站

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

金华兰溪网站建设河源正规网站建设价格

codevs 1040 统计单词个数 2001年NOIP全国联赛提高组 题目等级 : 黄金 Gold题目描述 Description给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入&#xff0c;且保证每行一定为20个)。要求将此字母串分成k份(1<k<40)&#xff0c…

网站建设要如何选择网站宣传推广

目录 1. 切换 Frame 2. 前进后退 3. 对 Cookies 操作 4. 选项卡管理(了解) 5. 异常处理 6. 反屏蔽 7. 无头模式 1. 切换 Frame 我们知道网页中有一种节点叫作 iframe&#xff0c;也就是子 Frame&#xff0c;相当于页面的子页面&#xff0c;它的结构和外部网页的结构完全…

如何用电脑做网站服务器网站后台管理系统地址

1 索引类型 返回面试宝典 主键索引&#xff08;PRIMARY&#xff09;:数据列不允许重复&#xff0c;不允许为NULL&#xff0c;一个表只能有一个主键。 唯一索引&#xff08;UNIQUE&#xff09;:数据列不允许重复&#xff0c;允许为NULL&#xff0c;一个表允许多个列创建唯一索引…

网站地图xml文件济南房产信息网官网

使用sealed关键字声明一个密封类或者接口 sealed interface Errorsealed class IOError(): Error密封类和接口能够很好的控制继承&#xff0c;在密封类和接口定义的模块和包外无法被继承 在编译期我们就已知了所有的密封类和接口的实现类。在某种意义上&#xff0c;密封类类似…

上街做网站微商代理

正题 题目链接:https://www.51nod.com/Contest/Problem.html#contestProblemId1149 题目大意 nnn个数&#xff0c;求有多少种选择方案使选择的数乘机为kkk。 解题思路 显然kkk的质因数最多只有999个&#xff0c;我们将质因数进行dpdpdp。若选择的数的质因数刚好是kkk的质因数…