当前位置: 首页 > news >正文

做地方短租网站万州网站制作公司

做地方短租网站,万州网站制作公司,汽车用品东莞网站建设,建设网站的请示结构性模式一共包括七种#xff1a; 代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。 1 代理模式介绍 软件开发中的代理#xff1a; 代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客…结构性模式一共包括七种 代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。 1 代理模式介绍 软件开发中的代理 代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客户不能看到的内容和服务或者增加客户需要的额外的新服务. 2 代理模式原理 3 静态代理实现 举例保存用户功能的静态代理实现 public interface IUserDao {void save(); }/*** 目标类**/ public class UserDaoImpl implements IUserDao {Overridepublic void save() {System.out.println(保存数据);} }/*** 代理类**/ public class UserDaoProxy implements IUserDao {private IUserDao target;public UserDaoProxy(IUserDao target) {this.target target;}Overridepublic void save() {System.out.println(开启事务); //扩展额外的功能target.save();System.out.println(提交事务);} }/*** 静态代理* 优点: 可以在不修改目标类的前提下,扩展目标类的功能* 缺点:* 1.冗余.由于代理对象要实现和目标对象一致的接口,会产生很多的代理.* 2.不易维护.一旦接口中增加方法,目标对象和代理对象都要进行修改.*/Testpublic void testStaticProxy(){//目标类IUserDao dao new UserDaoImpl();//代理对象UserDaoProxy proxy new UserDaoProxy(dao);proxy.save();}4 JDK动态代理 举例保存用户功能的静态代理实现 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;/*** 代理工厂类-动态的生成代理对象**/ public class ProxyFactory {//维护一个目标对象private Object target;public ProxyFactory(Object target) {this.target target;}//为目标对象生成代理对象public Object getProxyInstance(){return Proxy.newProxyInstance(//目标类使用的类加载器target.getClass().getClassLoader(),//目标对象实现的接口类型target.getClass().getInterfaces(),new InvocationHandler() { //事件处理器Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(开启事务);method.invoke(target,args);System.out.println(提交事务);return null;}});} }测试 public static void main(String[] args) {IUserDao userDao new UserDaoImpl();System.out.println(userDao.getClass()); //目标对象的信息IUserDao proxy (IUserDao) new ProxyFactory(userDao).getProxyInstance();//获取代理对象System.out.println(proxy.getClass());proxy.save();//代理方法while (true){}}5 类是如何动态生成的 6代理类的调用过程 我们通过借用阿里巴巴的一款线上监控诊断产品 Arthas(阿尔萨斯) ,对动态生成的代理类代码进行查看. 代理类代码如下: package com.sun.proxy;import com.mashibing.proxy.example01.IUserDao; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements IUserDao {private static Method m1;private static Method m3;private static Method m2;private static Method m0;public $Proxy0(InvocationHandler invocationHandler) {super(invocationHandler);}static {try { m1 Class.forName(java.lang.Object).getMethod(equals,Class.forName(java.lang.Object));m3 Class.forName(com.mashibing.proxy.example01.IUserDao).getMethod(save, new Class[0]);m2 Class.forName(java.lang.Object).getMethod(toString, newClass[0]);m0 Class.forName(java.lang.Object).getMethod(hashCode, newClass[0]);return;}catch (NoSuchMethodException noSuchMethodException) {throw new NoSuchMethodError(noSuchMethodException.getMessage());}catch (ClassNotFoundException classNotFoundException){throw new NoClassDefFoundError(classNotFoundException.getMessage());}}public final boolean equals(Object object) {try {return (Boolean)this.h.invoke(this, m1, newObject[]{object});}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final String toString() {try {return (String)this.h.invoke(this, m2, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final int hashCode() {try {return (Integer)this.h.invoke(this, m0, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final void save() {try {this.h.invoke(this, m3, null);return;}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}} }爲了方便理解简化后的代码 package com.sun.proxy;import com.mashibing.proxy.example01.IUserDao; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements IUserDao {private static Method m3;public $Proxy0(InvocationHandler invocationHandler) {super(invocationHandler);}static {try {m3 Class.forName(com.mashibing.proxy.example01.IUserDao).getMethod(save, new Class[0]);return;}}public final void save() {try {this.h.invoke(this, m3, null);return;}} }7 cglib动态代理 使用cglib 需要引入cglib 的jar包如果你已经有spring-core的jar包则无需引入因为spring中包含了cglib 。 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.2.5/version /dependency示例代码 目标类 /*** 目标类**/ public class UserServiceImpl {//查询功能public ListUser findUserList(){return Collections.singletonList(new User(tom,23));} }cglib代理类需要实现MethodInterceptor接口并指定代理目标类target import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Calendar; //在實現動態代理的同時擴展一個日志的功能 public class UserLogProxy implements MethodInterceptor {/*** 生成CGLIB动态代理类方法* param target 需要被代理的目标类* return: java.lang.Object 代理类对象*/public Object getLogProxy(Object target){//增强器类,用来创建动态代理类Enhancer enhancer new Enhancer();//设置代理类的父类字节码对象enhancer.setSuperclass(target.getClass());//设置回调enhancer.setCallback(this);//创建动态代理对象,并返回return enhancer.create();}/*** 实现回调方法* param o 代理对象* param method 目标对象中的方法的Method实例* param args 实际参数* param methodProxy 代理类对象中的方法的Method实例* return: java.lang.Object*/Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {Calendar instance Calendar.getInstance();SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);System.out.println(format.format(instance.getTime()) [ method.getName() ] 查询用户信息...);Object result methodProxy.invokeSuper(o, args);return null;} } public class User {private String name;private int age;public User(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}Overridepublic String toString() {return User{ name name \ , age age };} }8 cglib代理流程 9代理模式总结 參考文章 https://www.cnblogs.com/hg-blogs/p/17314887.html
http://www.hkea.cn/news/14352076/

相关文章:

  • 辅料企业网站建设费用网站设计与制作培训班
  • 展示型网站有哪些做个自己的影院网站怎么做
  • 自考在线做试卷的网站个人网站需不需要备案
  • 网站怎么优化上海做网站哪家公司好
  • 河北婚庆网站建设定制宁波网站优化公司推荐
  • 网站有哪几种怎样制作一个微信小程序
  • 装修设计图网站网站上做播放器流量算谁的
  • 如何做exo网站莱芜网站开发
  • 长丰县建设局网站赤峰市做网站公司
  • 网站业务怎么做的广州做网站星珀
  • 深圳市做网站建设晚上必看的正能量视频下载
  • 网站建设问题调查商城网站开发报价单
  • 网站建设 锐颖科技网页和网站有什么关系
  • 徐州住房和城乡建设部网站北京精兴装饰公司口碑怎么样
  • 建小公司网站最好的科技资讯网站
  • 网站制作优质公司互联网技术是什么
  • 阳逻开发区网站建设中企动力个人养老金
  • 旅游网站建设电子商务的困惑杭州公司有哪些
  • 哪里有网站建设公司阿里万网站建设
  • WordPress金融网站网页设计图片边框怎么设置
  • 招标网站官网成品网站软件
  • 阿里云买域名后怎么做网站小游戏网站欣赏
  • 免费自动推广手机软件seo营销的概念
  • 网站正在建设中9797装潢设计属于什么专业类别
  • 网站开发专业考啥证书深圳西乡做网站
  • 网站维护提醒php文件电商网站开发价格
  • 邢台做wap网站的地方wordpress 站内资讯
  • seo赚钱培训佛山推广优化公司
  • 做网站彩票代理多少钱啊好搜搜索引擎
  • 吉林省长春市建设局网站石家庄市工程勘察设计咨询业协会