------------------------------ 代理模式(Proxy) -------------------------------
(1)
代理的好处:
--->是可以在间接访问对象的同时,要其前或后,添加其它的逻辑代码.
--->对原来逻辑进行添加其它逻辑,最终生成新的逻辑.即:对类的方法添加一些额外的逻辑,生成新的方法逻辑.
(1)
代理的好处:
--->是可以在间接访问对象的同时,要其前或后,添加其它的逻辑代码.
--->对原来逻辑进行添加其它逻辑,最终生成新的逻辑.即:对类的方法添加一些额外的逻辑,生成新的方法逻辑.
(2)
静态代理:
-->一个原类与一个代理类要一一对应。
-->两者都实现共同的接口或继承相同的抽象类;
-->只是在代理类中,实例化原类,在原类方法的前后添加新的逻辑。
如下:
抽象角色:
abstract public class Subject
{
abstract public void request();
}
静态代理:
-->一个原类与一个代理类要一一对应。
-->两者都实现共同的接口或继承相同的抽象类;
-->只是在代理类中,实例化原类,在原类方法的前后添加新的逻辑。
如下:
抽象角色:
abstract public class Subject
{
abstract public void request();
}
真实角色:
public class RealSubject extends Subject
{
public void request()
{
System.out.println("From real subject.");
}
}
public class RealSubject extends Subject
{
public void request()
{
System.out.println("From real subject.");
}
}
代理角色:
public class ProxySubject extends Subject
public class ProxySubject extends Subject
{
private RealSubject realSubject; //以真实角色作为代理角色的属性
private RealSubject realSubject; //以真实角色作为代理角色的属性
public ProxySubject()
{ realSubject=new RealSubject(); }
{ realSubject=new RealSubject(); }
public void request() //与原方法名相同
{
preRequest();
{
preRequest();
realSubject.request(); //此处执行真实对象的request方法
postRequest();
}
}
private void preRequest()
{
//something you want to do before requesting
}
private void postRequest()
{
//something you want to do after requesting
}
}
{
//something you want to do before requesting
}
private void postRequest()
{
//something you want to do after requesting
}
}
客户端调用:
Subject sub=new ProxySubject();
Sub.request();
Subject sub=new ProxySubject();
Sub.request();
(3)
动态代理类
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
1)
Interface InvocationHandler:该接口中仅定义了一个方法:invoke(Object obj,Method method, Object[] args)
动态代理类
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
1)
Interface InvocationHandler:该接口中仅定义了一个方法:invoke(Object obj,Method method, Object[] args)
。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法
在代理类中动态实现。
2)
Proxy:该类即为动态代理类,其中主要包含以下内容:
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类
2)
Proxy:该类即为动态代理类,其中主要包含以下内容:
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类
的一个实例,返回后的代理类可以当作被代理类使用。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后
该class就宣称它实现了这些 interface。
3)
在使用动态代理类时,我们必须实现InvocationHandler接口,
public interface Subject
{
public void request();
}
3)
在使用动态代理类时,我们必须实现InvocationHandler接口,
public interface Subject
{
public void request();
}
具体角色RealSubject:同上;
代理角色:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject(Object obj) {
sub = obj;
}
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject(Object obj) {
sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
return null;
}
}
==>
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所
==>
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所
需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。
客户端:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client
{
static public void main(String[] args) throws Throwable
{
RealSubject rs = new RealSubject(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(),rs.getClass
{
static public void main(String[] args) throws Throwable
{
RealSubject rs = new RealSubject(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Subject subject = (Subject) Proxy.newProxyInstance(rs.getClass().getClassLoader(),rs.getClass
().getInterfaces(),ds );
subject.request();
}
subject.request();
}
5)
实例二:
package dynamicProxy;
public interface Work {
public void startWork();
}
实例二:
package dynamicProxy;
public interface Work {
public void startWork();
}
package dynamicProxy;
public class JasonWork implements Work {
public void startWork() {
System.out.println("jason start to work...");
}
}
public class JasonWork implements Work {
public void startWork() {
System.out.println("jason start to work...");
}
}
public interface Play {
public void startPlay();
}
public void startPlay();
}
public class JasonPlay implements Play {
public void startPlay() {
System.out.println("jason start to play...");
}
}
public void startPlay() {
System.out.println("jason start to play...");
}
}
public class Test {
public static void main(String[] args)
{
JasonWork work=new JasonWork();
InvocationHandler dynamicProxy=new DynamicProxy(work);
Work jasonproxy=(Work)Proxy.newProxyInstance(work.getClass().getClassLoader(),
public static void main(String[] args)
{
JasonWork work=new JasonWork();
InvocationHandler dynamicProxy=new DynamicProxy(work);
Work jasonproxy=(Work)Proxy.newProxyInstance(work.getClass().getClassLoader(),
work.getClass().getInterfaces(), dynamicProxy);
jasonproxy.startWork();
jasonproxy.startWork();
JasonPlay play=new JasonPlay();
InvocationHandler dynamicProxy=new DynamicProxy(play);
Play jasonproxy=(Play)Proxy.newProxyInstance(play.getClass().getClassLoader(),
InvocationHandler dynamicProxy=new DynamicProxy(play);
Play jasonproxy=(Play)Proxy.newProxyInstance(play.getClass().getClassLoader(),
play.getClass().getInterfaces(), dynamicProxy);
jasonproxy.startPlay();
}
}
===>动态代理类,可以与任何类型的真实类(work/play),进行结合,进行动态的代理.
jasonproxy.startPlay();
}
}
===>动态代理类,可以与任何类型的真实类(work/play),进行结合,进行动态的代理.
相关推荐
总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...
以下是对Java中常用设计模式的详细解释: 1. **单例模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于配置管理、线程池或者数据库连接池等场景。实现方式有懒汉式(线程不安全)、...
代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式...
java常用的设计模式一个简单总结,如工厂模式、单例模式、代理模式等等。(楼主也是未入门的菜鸟,如有错误请及时联系楼主更正,谢谢!)
在Java中,设计模式尤其重要,因为它们可以帮助我们编写出更灵活、可维护和易于扩展的代码。以下是对给定文件中提到的几种设计模式的详细解释: 1. **简单工厂模式(Simple Factory)**: - 简单工厂模式是一种...
### 常用设计模式及Java程序设计 #### 设计模式概述 设计模式是一种软件设计领域中的通用解决方案,用于描述解决常见设计问题的最佳实践。它不仅有助于提高代码的复用性和可读性,还能增强软件架构的灵活性和扩展...
Java中的设计模式是一种在软件开发过程中,为了应对特定问题而形成的通用解决方案...以上是关于Java中常用设计模式的详细解释,它们在实际编程中扮演着至关重要的角色,帮助开发者编写出高效、可扩展、易于维护的代码。
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
本文主要介绍Java中的几种常用设计模式及其应用。 首先,设计模式可以根据它们的用途被分类为三大类:创建模式、结构模式和行为模式。 创建模式主要涉及对象的创建,包括工厂方法模式、抽象工厂模式、单例模式、...
代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。通过引入代理,我们可以增加新的功能,如缓存、日志记录、访问控制等...
### Java常用设计模式详解 #### 一、设计模式概述 设计模式是一种在特定情况下解决软件设计问题的经验总结,它能够帮助开发者在面对相似的问题时快速找到解决方案。设计模式大致可以分为三大类:创建型模式、结构...
这23个常用的设计模式涵盖了创建型、结构型和行为型三大类别,是每一个Java开发者应当熟悉并掌握的基础知识。 1. **创建型设计模式**:主要包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例...
设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:...
以下是对给定文件中提到的几种Java设计模式的详细解析。 #### 1. 单例模式 (Singleton Pattern) 单例模式是一种常用的对象创建型模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。实现单例模式的关键...
这个压缩包“Java常用设计模式源码”显然提供了多种常见的Java设计模式实现,适合初学者进行学习和实践。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,有饿汉式、懒汉式、双重检查...
Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者...