96SEO 2026-02-19 06:53 0
创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码.

单例模式用来创建全局唯一对象工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,定制化地创建不同的对象.原型模式针对创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的.
结构型模式主要总结了一些类和对象组合在一起的经典结构,这些经典结构可以解决对应特定场景的问题.
一共包括七种代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。
在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为代理的第三者来实现间接访问.该方案对应的设计模式被称为代理模式.
原始定义是让你能够提供对象的替代品或其占位符。
代理控制着对于原对象的访问并允许将请求提交给对象前后进行一些处理。
代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客户不能看到的内容和服务或者增加客户需要的额外的新服务.
声明了真实主题和代理主题的共同接口,这样就可以保证任何使用真实主题的地方都可以使用代理主题,客户端一般针对抽象主题类进行编程。
代理Proxy类
提供了与真实主题相同的接口其内部含有对真实主题的引用它可以在任何时候访问、控制或扩展真实主题的功能。
真实主题Real
实现了抽象主题中的具体业务是代理对象所代表的真实对象是最终要引用的对象。
冗余。
由于代理对象要实现与目标对象一致的接口会产生过多的代理类。
//扩展额外功能target.save();System.out.println(提交事务);}
testStaticProxy(){//目标对象UserDaoImpl
UserDaoImpl();//代理对象UserDaoProxy
UserDaoProxy(userDao);proxy.save();}
API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能.动态代理又被称为JDK代理或接口代理.
静态代理在编译时就已经实现了,编译完成后代理类是一个实际的class文件动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中.
//目标对象实现的接口的类型InvocationHandler
//返回一个指定接口的代理类实例该接口可以将方法调用指派到指定的调用处理程序。
java.lang.reflect
在代理实例上处理方法调用并返回结果。
举例保存用户功能的静态代理实现
getProxyInstance(){//使用Proxy获取代理对象return
Proxy.newProxyInstance(target.getClass().getClassLoader(),
//目标类使用的类加载器target.getClass().getInterfaces(),
返回目标对象方法的返回值,没有返回值就返回null*/Overridepublic
{System.out.println(开启事务);//执行目标对象方法method.invoke(target,
args);System.out.println(提交事务);return
UserDaoImpl();System.out.println(target.getClass());//目标对象信息IUserDao
ProxyFactory(target).getProxyInstance();System.out.println(proxy.getClass());
Java虚拟机类加载过程主要分为五个阶段加载、验证、准备、解析、初始化。
其中加载阶段需要完成以下3件事情
通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的
由于虚拟机规范对这3点要求并不具体所以实际的实现是非常灵活的关于第1点获取类的二进制字节流class字节码就有很多途径
ProxyGenerator.generateProxyClass
所以动态代理就是想办法根据接口或目标对象计算出代理类的字节码然后再加载到JVM中使用
com.mashibing.proxy.example01.IUserDao;
java.lang.reflect.InvocationHandler;
java.lang.reflect.UndeclaredThrowableException;public
{super(invocationHandler);}static
Class.forName(java.lang.Object).getMethod(equals,
Class.forName(java.lang.Object));m3
Class.forName(com.mashibing.proxy.example01.IUserDao).getMethod(save,
Class.forName(java.lang.Object).getMethod(toString,
Class.forName(java.lang.Object).getMethod(hashCode,
NoSuchMethodError(noSuchMethodException.getMessage());}catch
NoClassDefFoundError(classNotFoundException.getMessage());}}public
UndeclaredThrowableException(throwable);}}public
UndeclaredThrowableException(throwable);}}public
UndeclaredThrowableException(throwable);}}public
UndeclaredThrowableException(throwable);}}
com.mashibing.proxy.example01.IUserDao;
java.lang.reflect.InvocationHandler;
java.lang.reflect.UndeclaredThrowableException;public
{super(invocationHandler);}static
Class.forName(com.mashibing.proxy.example01.IUserDao).getMethod(save,
类并且实现了被代理的所有接口以及equals、hashCode、toString等方法
代理类的构造函数参数是InvocationHandler实例Proxy.newInstance方法就是通过这个构造函数来创建代理实例的
h.invoke就是在调用ProxyFactory中我们重写的invoke方法
{System.out.println(开启事务);//执行目标对象方法method.invoke(target,
args);System.out.println(提交事务);return
是一个第三方代码生成类库运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。
cglib
为没有实现接口的类提供代理为JDK的动态代理提供了很好的补充。
最底层是字节码ASM是操作字节码的工具cglib基于ASM字节码工具操作字节码即动态生成代理对方法进行增强SpringAOP基于cglib进行封装实现cglib方式的动态代理
的jar包如果你已经有spring-core的jar包则无需引入因为spring中包含了cglib
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.2.5/version
}cglib代理类需要实现MethodInterceptor接口并指定代理目标类target
getLogProxy(){//增强器类,用来创建动态代理类Enhancer
Enhancer();//设置代理类的父类字节码对象en.setSuperclass(target.getClass());//设置回调:
对于代理类上所有的方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦截en.setCallback(this);//创建动态代理对象并返回return
java.lang.Object*/Overridepublic
Calendar.getInstance();SimpleDateFormat
HH:mm:ss);System.out.println(formatter.format(calendar.getTime())
UserServiceImpl();System.out.println(userService.getClass());//代理对象UserServiceImpl
UserLogProxy(userService).getLogProxy();System.out.println(proxy.getClass());ListUser
proxy.findUserList();System.out.println(用户信息:
使用CGLib实现动态代理CGLib底层采用ASM字节码生成框架使用字节码技术生成代理类在JDK1.6之前比使用Java反射效率要高。
唯一需要注意的是CGLib不能对声明为final的类或者方法进行代理因为CGLib原理是动态生成被代理类的子类。
在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后在调用次数较少的情况下JDK代理效率高于CGLib代理效率只有当进行大量调用的时候JDK1.6和JDK1.7比CGLib代理效率低一点但是到JDK1.8的时候JDK代理效率高于CGLib代理。
所以如果有接口使用JDK动态代理如果没有接口使用CGLIB代理。
动态代理与静态代理相比较最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理InvocationHandler.invoke。
这样在接口方法数量比较多的时候我们可以进行灵活处理而不需要像静态代理那样每一个方法进行中转。
如果接口增加一个方法静态代理模式除了所有实现类需要实现这个方法外所有代理类也需要实现此方法。
增加了代码维护的复杂度。
而动态代理不会出现该问题
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用代理对象可以扩展目标对象的功能代理模式能将客户端与目标对象分离在一定程度上降低了系统的耦合度
的《设计模式》一书中把它称作远程代理。
通过远程代理将网络通信、数据编解码等细节隐藏起来。
客户端在使用
服务的时候就像使用本地函数一样无需了解跟服务器交互的细节。
除此之外RPC
服务的开发者也只需要开发业务逻辑就像开发本地使用的函数一样不需要关注跟客户端的交互细节。
当你将浏览器配置成使用代理功能时防火墙就将你的浏览器的请求转给互联网当互联网返回响应时代理服务器再把它转给你的浏览器。
控制对一个对象的访问如果需要可以给不同的用户提供不同级别的使用权限。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback