`
Linkcyzk
  • 浏览: 2512 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式-代理模式

阅读更多

 一、代理模式

   为其他对象提供一种代理以便控制对这个对象的访问。

可以详细控制访问某个类(对象)的方法,在调用这个方法前作的前置处理(统一的流程代码放到代理中处理)。调用这个方法后做后置处理。

二、代理模式分类

1.静态代理(静态定义代理类,我们自己静态定义的代理类。比如我们自己定义一个明星的经纪人类)

2.动态代理(通过程序动态生成代理类,该代理类不是我们自己定义的。而是由程序自动生成)比较重要!!

        JDK自带的动态代理

        javaassist字节码操作库实现

        CGLIB

        ASM(底层使用指令,可维护性较差)

三、静态代理

模式结构图:

静态代理模式一般会有三个角色:

抽象角色:指代理角色(经纪人)和真实角色(明星)对外提供的公共方法,一般为一个接口

真实角色:需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业务逻辑在此。

代理角色:需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

 将统一的流程控制都放到代理角色中处理!

 

静态代理的实现模式:

首先创建一个接口(JDK代理都是面向接口的),

然后创建具体实现类来实现这个接口,

最后创建一个代理类同样实现这个接口,

不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可,这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。

按照以上分析代码如下:

//第一步:定义总接口MyEvent.java
public interface MyEvent {
	public void eventMethod();
}
/**
 * 第二步:创建具体实现类EventZhao.java
 * @author Administrator
 */
public class EventZhao implements MyEvent {

	public void eventMethod() {
		System.out.println("EventZhao中出事了");
	}
}
/**
 * 第三步:创建代理类StaticProxy.java
 * @author Administrator
 */
public class StaticProxy implements MyEvent {
	private EventZhao target;

	public StaticProxy(EventZhao target) {
		this.target = target;
	}

	@Override
	public void eventMethod() {
		System.out.println("如何为你去辩护。。。。。。。。。");
		System.out.println("如何为你去辩护。。。。。。。。。");
		System.out.println("如何为你去辩护。。。。。。。。。");
		this.target.eventMethod();
		System.out.println("拿钱。。。");
		System.out.println("拿钱。。。");
		System.out.println("拿钱。。。");
	}
}

 

测试类:
public class KaiTing {

	public static void main(String[] args) {
		EventZhao ez=new EventZhao();
		StaticProxy sp=new StaticProxy(ez);
		sp.eventMethod();
	}
}

测试结果:

如何为你去辩 护。。。。。。。。。

如何为你去辩护。。。。。。。。。

如何为你去辩护。。。。。。。。。

EventZhao中出事了

拿钱。。。

拿钱。。。

拿钱。。。

四、动态代理

 动态代理的思维模式与静态模式是一样的,也是面向接口进行编码,创建代理类将具体类隐藏解耦,

不同之处在于代理类的创建时机不同,动态代理需要在运行时因需实时创建。

实现动态代理模式的方式有两种。

4.1依赖于jdk的Proxy对象下的newInstance方法

如果使用的是该方式来实现动态代理。要求必须要有事件,委托人必须要实现事件接口

代码实现:

/**
 * 第一步:定义总接口MyEvent.java
 * @author Administrator
 */
public interface MyEvent {
	public String sayHello(String msg);
}
/**
 * 第二步:创建具体实现类MyTarget.java
 * @author Administrator
 */
public class MyTarget implements MyEvent {

	@Override
	public String sayHello(String msg) {
		// TODO Auto-generated method stub
		return "张三 say"+msg;
	}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGLIBProxy implements MethodInterceptor {
	 //要代理的原始对象
    private Object obj;
    
    public Object createProxy(Object target) {
        this.obj = target;
         Enhancer enhancer = new Enhancer();
        // 设置被代理对象目标
        enhancer.setSuperclass(this.obj.getClass());
       // 回调
        enhancer.setCallback(this);
        enhancer.setClassLoader(target.getClass().getClassLoader());
        return enhancer.create();
    }


    /**
     * 在代理实例上处理方法调用并返回结果
     * 
     * @param proxy
     *            代理类
     * @param method
     *            被代理的方法
     * @param params
     *            该方法的参数数组
     * @param methodProxy
     */
    public Object intercept(Object proxy, Method method, Object[] params,
            MethodProxy methodProxy) throws Throwable {
        Object result = null;
        // 调用之前
        doBefore();
        // 调用原始对象的方法
        result = methodProxy.invokeSuper(proxy, params);
        // 调用之后
        doAfter();
        return result;
    }

    private void doBefore() {
        System.out.println("before method invoke");
    }

    private void doAfter() {
        System.out.println("after method invoke");
    }
}
import java.lang.reflect.Proxy;
/**
 * 创建测试类
 * @author Administrator
 */
public class Test {
	public static void main(String[] args) {
		MyEvent e = new MyTarget();
		MyProxy p = new MyProxy(e);
		MyEvent me = (MyEvent) Proxy.newProxyInstance(e.getClass()
 .getClassLoader(), e.getClass().getInterfaces(), p);

		String str = me.sayHello("hello world");
		System.out.println(str);
	}
}

运行结果:

张三 sayHELLO WORLD

4.2 cglib字节码修改器

他与jdk中的实现动态代理方式不同的就是,委托人不需要实现特定的接口

如果使用cglib实现动态代理。不要忘记导入jar包。

 

代码实现:

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGLIBProxy implements MethodInterceptor {
	 //要代理的原始对象
    private Object obj;
    
    public Object createProxy(Object target) {
        this.obj = target;
         Enhancer enhancer = new Enhancer();
        // 设置被代理对象目标
        enhancer.setSuperclass(this.obj.getClass());
       // 回调
        enhancer.setCallback(this);
        enhancer.setClassLoader(target.getClass().getClassLoader());
        return enhancer.create();
    }


    /**
     * 在代理实例上处理方法调用并返回结果
     * 
     * @param proxy
     *            代理类
     * @param method
     *            被代理的方法
     * @param params
     *            该方法的参数数组
     * @param methodProxy
     */
    public Object intercept(Object proxy, Method method, Object[] params,
            MethodProxy methodProxy) throws Throwable {
        Object result = null;
        // 调用之前
        doBefore();
        // 调用原始对象的方法
        result = methodProxy.invokeSuper(proxy, params);
        // 调用之后
        doAfter();
        return result;
    }

    private void doBefore() {
        System.out.println("before method invoke");
    }

    private void doAfter() {
        System.out.println("after method invoke");
    }
	
}
public class MyTarget {
	public void sayHello(){
		System.out.println("SayHello");
	}
}

测试类:

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyTarget m = new MyTarget();
		CGLIBProxy proxy = new CGLIBProxy();
		MyTarget mt = (MyTarget)proxy.createProxy(m);
		mt.sayHello();		
	}
}

运行结果:

before method invoke
SayHello
after method invoke
分享到:
评论

相关推荐

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们将深入探讨代理模式的概念、实现方式以及它在实际开发中的应用。 代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象控制对原对象的访问。在...

    设计模式-代理模式(讲解及其实现代码)

    设计模式-代理模式(讲解及其实现代码)

    java常用设计模式-代理模式

    Java 设计模式 - 代理模式 代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加...

    Java设计模式-代理模式

    代理模式是这些设计模式中的一种,它为其他对象提供一种代理以控制对这个对象的访问。代理模式的核心思想是在目标对象和客户端之间插入一个代理对象,代理对象可以扩展目标对象的功能,同时也能控制对目标对象的访问...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

    JAVA-设计模式-结构型模式-代理模式

    JAVA-设计模式-结构型模式-代理模式

    设计模式--代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...

    java设计模式-代理模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    c++设计模式-结构型模式-代理模式

    代理模式是一种在面向对象设计中广泛应用的结构型设计模式,它提供了一种对目标对象进行间接访问的方式,使得客户端可以通过代理对象与真实对象进行交互,而无需直接接触真实对象。这样做的好处包括增加灵活性、控制...

    设计模式-Java语言中的应用

    通过阅读《设计模式-Java语言中的应用》,读者不仅可以掌握设计模式的基本概念和原理,还能学习到如何在实际项目中选择合适的设计模式,以及如何优雅地在Java代码中实现这些模式。这将有助于提升开发者的编程技巧,...

    C++设计模式-基于QT4开源跨平台开发框架 源码

    设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):提供一个统一的接口,用来访问子系统的一组接口。 - 适配器模式(Adapter):使两个接口不兼容的类能够协同工作。 ...

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

    设计模式课件大全

    设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

Global site tag (gtag.js) - Google Analytics