Java设计模式之-------->"代理模式"

 01.什么是代理模式?

  解析:代理(Proxy):代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,

而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。

这些额外的操作通常需要与实际对象进行通信。

 02.代理的组成都有什么?

  解析:由三部分组成,分别是:抽象对象(Subject 接口),真实对象(RealSubject 实现了Subject接口),代理对象(ProxySubject)

        

  03.代理对象作用场景?

  解析:

   第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实[DP]

第二:需补代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象[DP].这样就可以达到性能的最优化.

   04.代理有几种?

解析:代理有两种类型,即 动态代理和静态代理,

动态代理:动态代理,在Struts和Spring等框架中都用到了动态代理,用于帮助程序员生成其要使用的类的子类或本类,这样框架就可以再代码之前做一些动作,

比如前置方法增强,后置方法增强,记录日志,异常捕获等等.在程序运行时运用反射机制动态创建而成

(插: AOP(AspectOrientedProgramming):将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,

我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码---解耦。)

      静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

    动态代理 VS 静态代理:

静态代理类优缺点

优点:

 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合)

缺点:

1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,

除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

如上的代码是只为UserManager类的访问提供了代理,但是如果还要为其他类如Department类提供代理的话,就需要我们再次添加代理Department的代理类。

 静态代理---------->案列

 01.创建一个接口:

package cn.work.proxy;
//抽象对象
public interface Subject {
	public String request();
}

 02.创建一个实现类:

package cn.work.proxy;
//真实对象
public class RealSubject implements Subject {

	public String request() {
		return "真实对象";
	}

}

 03.创建一个代理对象:

package cn.work.proxy;

public class ProxySubject {

	//把抽象对象组成代理对象的字段
	private Subject sub;

	public Subject getSub() {
		return sub;
	}

	public void setSub(Subject sub) {
		this.sub = sub;
	}

	public String reqString(){
		System.out.println("代理增强");
		return sub.request();
	}
}

 04.创建Test测试类:

//对象代理
	@Test
	public void test09() {
		Subject sub=new RealSubject();
		ProxySubject ps=new ProxySubject();
		ps.setSub(sub);
		System.out.println(ps.reqString());
	}

  

  动态代理优点:

  动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,

在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强

  

  动态代理--------->实例

  01.创建一个DAO接口

package cn.work.dao;

import cn.work.entity.User;

public interface UserDao {
	public void add(User user);
}

  02.创建一个DAO接口的实现

package cn.work.dao;

import cn.work.entity.User;

public class UserImpl implements UserDao{

	public void add(User user) {
		System.out.println("sava success");
	}

}

  03.创建测试类

     @Test
	public void test10(){
		User user=new User();
		final UserDao userDao=new UserImpl();
		UserDao u =(UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
				userDao.getClass().getInterfaces(), new InvocationHandler() {

					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
							System.out.println("代码增强");
						return method.invoke(userDao, args);
					}
				} );
		u.add(user);
	}

  参数说明:  

  Proxy.newProxyInstance(loader, interfaces, h)

  loader:类加载器,传入你要代理的对象,通过 对象名.getClass().getClassLoader()来拿到该对象的类加载器.

  interfaces:被代理对象的所有实现接口的集合

  InvocationHandler 是代理实例的调用处理程序 实现的接口
 实现InvcationHandler的米明内部类,  new InvcationHandler(){     public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		......
		return ....;
	}
  }
时间: 2024-10-30 02:38:32

Java设计模式之-------->"代理模式"的相关文章

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

java设计模式6——代理模式

java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代理 动态代理 1.3.代理模式关系图(以租房子为例) 2.静态代理 2.1.角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理客户:代理真实角色.代理真实角色后,我们一般会做一些附属的操作 客户:访问代理对象的人 2.2.例1(租房子演示) 2.2.1.抽象角色实现(

Java 设计模式_代理模式(2016-08-19)

概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 类图: 在代理模式中的角色: ● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ● 目标对象角色:定义了代理对象所代表的目标对象. ● 代理对象角色:代理对象内部含有目标对象的

Java设计模式:代理模式(一)

问题的提出 现在生活中,常常在微信朋友圈里面看到代购的信息,你想在国外买什么,香港买什么,但是又懒得自己过去,于是常常委托别人帮忙买奶粉买那啥的.这类问题的缘由是因为客户和原产地没有直接的接触,所以需要一个代理(代购)的第三者来实现间接引用.代理对象可以在客户端和目标对象间起到中介作用,而且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务.代理模式是一种很好实现客户对象与代理对象分离的策略.其抽象UML图如下图 代理模式包含如下角色 ISubject:抽象主题角色,是一个接

Java设计模式——Proxy(代理)模式

Proxy(代理)模式为对象提供一个代理或者占位来控制对该对象的访问. 图像代理 使用Proxy模式的设计有时非常脆弱,它们依赖转发方法来调用其底层对象.转发可能会建立一个非常脆弱并且需要经常维护的设计. load()方法以JFrame对象为参数,用于在指定图像加载完毕之后进行回调.在执行load()方法的时候,它先以LOADING引用的图像对象为参数调用setImage(),然后重新绘制图形显示窗口,最后为自己启动一个单独的线程.而run()方法是在单独的线程中执行的,该方法根据构造器中指定的

JAVA设计模式之 代理模式【Proxy Pattern】

一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类:ProxySubject 包含了对真实(委托)对象(RealSubject)的引用,在实现

Java设计模式之代理模式(Proxy)

前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils 的task也是通过代理模式来访问的.为何要采用代理模式呢?有什么好处呢?抱着这些疑问!今天来学习总结一下. 什么是代理模式? 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个

java设计模式之八代理模式(Proxy)

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: [java] view plaincopy public interface Sourcea

java设计模式之代理模式模式总结

定义:代理模式这种设计模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 解读定义: 1.代理对象和目标对象有共同的接口: 2.使用代理对象执行目标对象中的方法: 3.在代理对象中增强目标对象方法. 设计模式原则:开闭原则(对扩展开放,对修改关闭).一种好的设计模式甚至是架构,都是在不修改原有形态的基础上扩展出新的功能. 下面从代码角度理解代理模式: 要素:帅哥.美女.媒婆,那么美女害羞不好意思说话,这个时候媒婆就充当代理对象的身份.美女就是目标对象,并且还