代理模式

head first Design Pattern Proxy

大城市里の小女人 提交于 2020-01-29 17:13:57
客户对象-客户辅助对象-服务辅助对象-服务对象 RMI提供了客户辅助对象和服务辅助对象,自己不用写网路或IO代码,客户程序调用远程方法就和在运行本地JVM上对对象进行正常方法调用一样。RMI提过了查找服务用来寻找和访问远程对象。 制作远程服务:1. 制作远程接口:定义可以让客户远程调用的方法,客户将它用作服务的类类型。扩展java.rim.Remote 用远程接口扩展Remote这个接口 public interface MyRemote extends Remote{ //每次远程方法调用都必须考虑“有风险的”。在每个方法中声明RemoteException,可以让客户注意到这件事。 public String sayHello() throws RemoteException; 确定变量和返回值是属于原语(primitive)类型还是可序列化(Serializable)类型,因为远程方法的变量必须被打包并通过网络运送,要靠序列化来完成,如果使用原语类型、字符串和许多API中内定的类型(包括数组和集合)都不会有问题,但是对于自己定义的类,就必须保证你的类实现了Serializable。 } 2. 制作实际的工作类,实现远程接口 public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {

SpringAOP

此生再无相见时 提交于 2020-01-29 06:23:07
AOP:面向切面编程,是Spring的两大基石之一。 AOP:作用 1、日志 按照以前的写法,会造成: 1)、代码混乱,越来越多的非业务需求(日志、验证等)加入后,原有的业务方法急剧膨胀,每个方法在处理核心业务逻辑的同时还必须兼顾其他的点。 2)、代码分散,以日志需求为例,只是为了满足这个单一的需求,就不得不在多个模块方法中加入重复相同的日志代码,如果日志需求变化,则要大量修改。 package aop; /** * @author chenpeng * @date 2018/6/3 21:33 */ public class ArithmeticCalculatorLogImpl implements ArithmeticCalculator { @Override public int add(int i, int j) { //每个方法都要这样加日志,麻烦 System.out.println("add....."+(i+j)); return i+j; } @Override public int sub(int i, int j) { System.out.println("sub....."+(i-j)); return i-j; } @Override public int mul(int i, int j) { System.out.println("mul....

用实例理解设计模式——代理模式(Python版)

送分小仙女□ 提交于 2020-01-29 04:32:58
代理模式 : 为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式分为: 静态代理 动态代理 由下面三部分组成 : 抽象角色 :通过接口或抽象类声明真实角色实现的业务方法。 代理角色 :实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色 :实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。 静态代理 在程序运行前,就已经确定代理类和委托类的关系的代理方式,被称为 静态代理 。 例: 小明请律师进行诉讼 诉讼流程可抽象为 ILawsuit 类,如下: import abc class ILawsuit ( metaclass = abc . ABCMeta ) : @abc . abstractmethod def submit ( self ) : # 提交申请 pass @abc . abstractmethod def burden ( self ) : # 进行举证 pass @abc . abstractmethod def defend ( self ) : # 开始辩护 pass @abc . abstractmethod def finish ( self ) : # 诉讼完成 pass

Java设计模式——代理模式

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-29 00:29:17
代理模式 学习目标 掌握代理模式的应用场景和实现原理。 应用场景 保护目标对象:客户并不知道对象是如何实现具体业务功能的,只要调用代理对象的接口就行了。 增强目标对象:在实现目标对象的业务功能之前或者之后做一些业务实现。 Spring-AOP 实现原理 静态代理:代理对象持有被代理对象的引用。由被代理对象实现目标业务。 动态代理:代理对象持有被代理对象的引用,代码运行产生一个新的 java 类,并被编译重新加载,然后在新的类中执行目标业务实现动态代理。 了解静态代理和动态代理的区别。 静态代理:被代理对象在代码中被写死了,不易扩展,适用于简单的业务,代码复用性不高,违背开闭原则。 动态代理:只要是实现了同一个接口的被代理类,都可以代理实现,实现了业务扩展。代码复用,遵循开闭原则。 了解 CGLib和JDK-proxy 的区别。 JDK-proxy 动态代理:实现了被代理对象的接口,生成新的class字节码,利用反射调用实现代理。 无法代理不实现代理业务接口的方法。 CGLib 动态代理:继承被代理对象,生成新的class字节码,通过 fastclass 机制调用实现代理。 无法代理被final关键字修饰的方法 代理模式的定义 为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和服务端起到中介的作用。是一种结构型设计模式。 静态代理 /** * @description

Spring004--Spring AOP(mooc)

耗尽温柔 提交于 2020-01-28 19:24:59
一。Spring AOP概览 1.1。AOP(面向切面编程)是什么 1。 AOP是一种编程范式,而不是编程语言。   2。解决特写问题,不能解决所有问题   3。是OOP的补充,不是替代 除了面向切面编程,还有如下编程范式:   1。面向过程编程:如c/python   2。面向对象编程:如java/c++   3。函数式编程   4。事件驱动编程(GUI开发中比较常见)   5。面向切面编程 1.2。AOP(面向切面编程)解决的问题 1。DRY:Don't Repeat yourself 避免代码重复问题 2。SoC:Separation of Concerns 关注点分离 (1)。水平分离:展示层-》服务层-》持久层   (2)。垂直分离:模块划分(订单/库存等业务角度) (3)。切面分离:分离功能性需求与非功能性需求(把非功能性需求从功能性需求中剥离开来集中管理) 1.3。AOP(面向切面编程)好处 AOP好处即为“集中管理”: 1。集中处理某一关注点/横切逻辑; 2。可以方便的添加/删除关注点; 3。侵入性少,增强代码可读性及可维护性; 1.4。AOP(面向切面编程)应用声景 1。权限控制 2。缓存控制 3。事务控制(数据库事务控制) 4。审计日志(操作记录) 5。性能监控 6。分布式追踪 7。异常处理 以上为偏非功能性需求,特别适合AOP应用声景。 1.5。支持AOP

了解Spring中常见的设计模式-------------------代理模式

拜拜、爱过 提交于 2020-01-28 05:25:29
代理模式(Proxy Pattern) 指为其他对象提供一种代理,以控制对这个对象的访问。 代理对象在客服端和目标对象之间起到中介作用 属于结构型设计模式。 适用场景:保护目标对象,增强目标对象 静态代理:显示声明被代理对象 动态代理:动态配置和替换被代理对象 无法代理final修饰的方法 静态代理 代理类与被代理类属于(1:1)一对一的关系,被代理类新增了某个方法,代理类也需要进行相应的修改,不符合开闭原则。 public interface Person { void saleHouse(); void getName(); } public class HousHolder implements Person { @Override public void saleHouse() { System.out.println("houseHolder sale house"); } @Override public void getName() { System.out.println("the name of house"); } } public class HouseSaler implements Person { private HousHolder housHolder; public HouseSaler(HousHolder housHolder) { this

nginx基本功能和工作原理

允我心安 提交于 2020-01-27 13:18:40
nginx能做什么 反向代理 正向代理 负载均衡 HTTP服务器(包含动静分离) 反向代理和正向代理 正向代理。简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。结论就是,正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 反向代理。例如我要访问 localhost:8080/views/test1 这个页面,但view对应的服务器上并没有test1这个资源,它是从另一台服务器上调用的资源。这样view对应的那个服务器就使用了反向代理。即用户只需要把请求发给特定的反向代理服务器,具体请求是谁处理的用户不需要知道(其实也不知道),由代理服务器统一处理。结论就是 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器

spring ioc和aop的含义

霸气de小男生 提交于 2020-01-27 12:03:50
自己整理的一些笔记,如有错误欢迎提出指正,谢谢 1.IOC的定义? IOC:另外一种说法叫DI(Dependency Injection),即依赖注入,是一种设计思想。 我们通过IOC将相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。 作用是为了解耦,降低类之间的耦合度,其设计思想就是设计模式的工厂模式, 我们并不需要知道其生产的具体过程,我们只要其产出的对象即可。 其工作流程就是:在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化, 在你需要调用的时候,把已经初始化的bean分配给你要调用这些bean的类,而不用去创建一个对象的实例。 2.IOC的传值方式有哪些? 一般的是设值传入和构造方法传入。 3.IOC的容器有哪些? 常见的一般是ApplicationContext和BeanFactory,这两个容器的区别请看这里: http://blog.csdn.net/hi_kevin/article/details/7325554 4.依赖注入的实现方式 就是Java的反射,通俗的来讲就是根据给出的类名来动态地生成对象,用set方法将事先保存在hashmap中的类属性注入到类中。 AOP: 面向切面编程,被定义为促使软件系统实现关注点的分离的技术。

代理模式-CGLIB动态代理

自古美人都是妖i 提交于 2020-01-27 03:04:23
1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。 2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法。 CGLIB动态代理 : 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。 但对于无接口的类,要为其创建动态代理类,就要使用CGLIB来实现。CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,即不能是final的类。 CGLIB(Code Generation Library)是一个开源项目,是一个强大的、高性能的、高质量的代码生成类库。它可以在运行期扩展喝增强Java类。Hibernate用它来实现持久对象的字节码的动态生成,Spring用它来实现AOP编程。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架)来转换字节码并生成新的类。CGLIB是通过对字节码进行增强来生成代理的。 代理实现与解析: 使用CGLIB创建代理步骤: 步骤1

AOP与IOC区别

你。 提交于 2020-01-26 23:34:08
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转