代理模式

设计模式之结构模式---代理模式

本小妞迷上赌 提交于 2020-01-24 04:02:16
代理模式(Proxy) 代理模式其实从字面上来说很好理解。实际生活中,形形色色的明星都会有自己的经纪人吧。这个经纪人其实就是明星的代理。他先负责跟投资方谈谈,然后明星才开始接拍电影,唱歌,跳舞啥的。我们的代码示例也以这个例子为业务基础。回到理论层面,代理模式就是多一个代理类出来,替原对象进行一些操作。代理模式又可以分为静态代理模式和动态代理模式,动态代理模式又分为JDK动态代理和cglib动态代理。首先我们来写静态代理模式代码,并分析静态代理模式的优缺点: 第一步,我们来声明两类明星的接口,歌星和舞星 /** * @author chenglezheng */ public interface SongStar { void song(String startName); } /** * @author chenglezheng */ public interface DanceStar { void dance(String startName); } 然后我们再写两类接口具体的实现 /** * @author chenglezheng */ public class SongStarImpl implements SongStar { public void song(String startName) { System.out.println(startName+

Spring AOP通俗理解与应用

笑着哭i 提交于 2020-01-23 13:21:04
目录 AOP 图解AOP 概念 通俗理解AOP 作用 实现方式 应用场景 应用 Aop与SpringAOP的关系   关于AOP,一般都会先去了解AOP的基础概念,如切点、通知、连接点、切入点 、引入和织入等,面对晦涩难懂的概念,很容易陷入困境,找了几篇讲解较好的文章,将其整合起来,帮助深入理解AOP AOP   AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 作用   为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 图解 传统的纵向体系代码复用: 横向抽取机制(AOP思想): 概念 1.通知(Advice)   就是你想要的功能,也就是上面说的安全,事务,日志等。你得先定义好把,然后在想用的地方用一下。 2.连接点(JoinPoint)   这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后

代理模式

巧了我就是萌 提交于 2020-01-23 11:42:58
代理模式 : 为其他对象提供一种代理以控制对这个对象的访问。 代理模式是对象的结构模式,代理模式给某一个对象提供一个代理对象,并由此代理对象控制对原代理对象的引用。代理模式不应该让用户感觉到代理的存在,所以代理对象和原对象的对外的调用接口是一致的。 代理模式一般包括三个角色: 抽象主题角色(Subject):它的作用是统一接口。此角色定义了真实主题角色和代理主题角色共用的接口,这样就可以在使用真实主题角色的地方使用代理主题角色。 真实主题角色(RealSubject):隐藏在代理角色后面的真实对象。 代理主题角色(ProxySubject):它的作用是代理真实主题,在其内部保留了对真实主题角色的引用。 它与真实主题角色都继承自抽象主题角色,保持接口的统一 。它可以控制对真实主题的存取,并可能负责创建和删除真实对象。代理角色并不是简单的转发,通常在将调用传递给真实对象之前或之后执行某些操作,当然你也可以只是简单的转发。 与适配器模式相比:适配器模式是为了改变对象的接口,而代理模式并不能改变所代理对象的接口。 思维导图: 使用场景: 实现延迟加载。 <?php/** * Proxy design pattern (lazy loading)@global * 实现了图片的延迟加载 */ /* 抽象主题角色,提供统一接口 */ interface ImageInterface {

Spring AOP 源码解析

若如初见. 提交于 2020-01-23 10:46:26
[TOC] 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先搞懂 IOC 容器的源码 ,AOP 依赖于 IOC 容器来管理。2、仔细看完 Spring AOP 使用介绍 这篇文章,先搞懂各种使用方式,你才能"猜到"应该怎么实现。 Spring AOP 的源码并不简单,因为它多,所以阅读源码最好就是找到一个分支,追踪下去。 本文定位为走马观花,看个大概,不具体到每一个细节。 目录: 前言 这一节,我们先来"猜猜" Spring 是怎么实现 AOP 的。 在 Spring 的容器中,我们面向的对象是一个个的 bean 实例,bean 是什么?我们可以简单理解为是 BeanDefinition 的实例,Spring 会根据 BeanDefinition 中的信息为我们生产合适的 bean 实例出来。 当我们需要使用 bean 的时候

动态代理设计模式,及实现原理

こ雲淡風輕ζ 提交于 2020-01-22 23:58:29
动态代理模式,前提还是代理模式,只是优化了静态代理的一些不足。 比如,静态代理在一对一关系出现时,创建的代理对象较多,代码量也大,可维护性就会稍差,在一对多的代理关系出现是,可扩展性就更差了。 而动态代理,就是在使用时,才去创建代理类和实例,这样就可以通过一个动态代理类解决创建多个静态代理的问题,更灵活了。 当然动态代理的缺点也是有的,就是相比静态代理直接调用目标对象方法,动态代理效率会低,因为它是通过反射机制,间接调用目标方法的。 所以,在讨论动态代理前,需要先说说静态代理,及反射。 先说反射,通常对一个类对象执行操作时,都要先知道它是什么类,是做什么的,然后去实例化 对象进行操作。 但是,反射则是一开始不知道要初始化的类是什么,无法使用new关键字来创建对象。而是在运行时才知道要操作的类是什么,可以在运行时获取类的完整构造,并调用对应的方法,访问属性。 那反射跟运行时类信息(RTTI)有什么区别呢? 运行时类型识别(Run-Time Type Identification),使得可以在程序运行时发现和使用类型信息。 Java有两种方式可以让我们在运行时识别对象和类的信息,一种是RTTI,它假定在编译时已经知道了所有的类型;另一种就是反射,允许在运行时发现和使用类信息。 RTTI的基本使用 package rtti; import java.util.Arrays; import

nginx 代理https后,应用redirect https变成http --转

烈酒焚心 提交于 2020-01-22 22:50:26
原文地址:http://blog.sina.com.cn/s/blog_56d8ea900101hlhv.html 情况说明 nginx配置https,tomcat正常http接受nginx转发。 nginx 代理https后,(java代码redirect地址)应用redirect https变成http 情况类似 http://2hei.net/mt/2010/02/request-getscheme-cannt-get-https.html http://yywudi.info/nginx-https-400-bad-request-solution/ 原因分析: 经过nginx代理后用的spring mvc的redirect, 其中: request.getScheme() return http but not https. 浏览器调整的地址变成http 解决办法:http://han.guokai.blog.163.com/blog/static/136718271201211631456811/ 在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )? 在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果: request.getScheme() //总是 http

【设计模式自习室】详解代理模式

怎甘沉沦 提交于 2020-01-22 19:26:02
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 应用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 【设计模式自习室】理解工厂模式的三种形式 【设计模式自习室】适配器模式 【设计模式自习室】装饰模式 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化 【设计模式自习室】门面模式 Facade Pattern 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量 结构型——代理模式 Proxy Pattern 引子 通俗的来讲,代理模式就是我们生活中常见的 中介 。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。 为什么要用代理模式 中介隔离作用 :在某些情况下

设计模式(单例和简单代理)

不羁岁月 提交于 2020-01-22 09:47:14
设计模式(单例和简单代理) 一、单例(Singleton) 确保一个类只有一个实例,并提供该实例的全局访问点。 Ⅰ 饿汉式 顾名思义,饿汉初始化类时,直接静态加载 SingletonDemo01 类的实例 instance , 不管用到没用到这个实例,都创建出来了 ,所以没有延时加载的优势。 ***评价:**线程不安全的问题主要由于实例化多次才会造成,采取直接实例化不会产生线程不安全问题,但也丢失了延迟实例化带来的节约资源你的好处 /** * 测试饿汉式单例模式 * @author wangqun * */ public class SingletonDemo01 { //类初始化时,立即加载这个对象(没有延时加载的优势!) 由于加载类时天然线程安全! private static SingletonDemo01 instance = new SingletonDemo01 ( ) ; private SingletonDemo01 ( ) { } //方法不用加synchronized 效率高! public static SingletonDemo01 getInstance ( ) { return instance ; } } Ⅱ 懒汉式 类初始化时,没有创建对象,真正使用的时候才创建! 评价: 这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if

Spring常见面试题总结(超详细回答)

走远了吗. 提交于 2020-01-22 09:10:26
1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? (1)spring属于低侵入式设计,代码的污染极低; (2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; (3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 (4)spring对于主流的应用框架提供了集成支持。 3、Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系

Java代理模式总结及案例

我是研究僧i 提交于 2020-01-22 01:57:26
1.静态代理 1.代理模式 实现原理:代理类和真实类都实现同一个接口,实际还是依赖真实类去实现功能 1.1代理模式代码 package com . amarsoft . designmode . proxy ; /** * 代理模式:提供一个统一的接口,具体的实现类和代理类都实现该接口,用于代理类可以完成具体类相同的方法 * @author amarsoft * */ public interface Subject { //统一的方法 void request ( ) ; } -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- package com . amarsoft . designmode . proxy ; /** * 代理类 * @author 小虾 */ public class Proxy implements Subject { //被代理的类 public RealSubject subject ; @Override public void request ( ) { System . out . println ( "proxy implements ways..." ) ; if ( subject == null ) { subject = new