`

代理模式(Proxy Pattern)_Java

阅读更多

Proxy Pattern

代理模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标之间起到中介的作用。

举个例子:
我想买一台lenovo的电脑,我去总部去买,可是人家不卖给我,于是我找到了联想的代理,从代理那里买到了一台电脑,我知道,他们肯定加价了!

上面的例子就是一个简单的代理模式,我不能直接去总部买,但是我可以通过代理去买,通过代理的一个缺点就是代理会给你加上一些额外的金钱或者其他的内容。

代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;(比如卖电脑这个接口)
真实角色:代理角色所代表的的真实对象,是我们最终要引用的对象;
代理角色:代理对象角色内部包含对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口(卖电脑)以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作(比如加价),相当于对真实对象进行封装。

下面以买lenovo电脑为例

 

package com.pattern.proxy;

public interface Sales {
	public void sale();//无论是lenovo公司还是代理,都是要卖产品的
}

package com.pattern.proxy;

public class Lenovo implements Sales{

	@Override
	public void sale() {
		System.out.println("Lenovo sale...");//这是让代理来请求的,个人用户不能直接来(人为规定)
	}

}

 

package com.pattern.proxy;

public class Proxy implements Sales{

	private Sales sale;//代理的产品,可以选择lenovo作为代理的产品
	public Proxy(Sales sale){
		this.sale=sale;
	}
	@Override
	public void sale() {
		sale.sale();//调用真实对象的方法
	}

}

 

package com.pattern.proxy;

public class Test {

	public static void main(String[] args) {
		Lenovo l=new Lenovo();//联想公司
		Sales s=new Proxy(l);//代理商s代理了联想公司l
		s.sale();//向代理s买了一台联想电脑:Lenovo sale...
	}
}

 

 

 使用代理模式的最大好处就是可以在真实对象请求的前后可以加入特有的操作:

 

package com.pattern.proxy1;

public class Proxy implements Sales{

	private Sales sale;//代理的产品,可以选择lenovo作为代理的产品
	public Proxy(Sales sale){
		this.sale=sale;
	}
	@Override
	public void sale() {
		System.out.println("before sale...");
		sale.sale();//调用真实对象的方法
		System.out.println("after sale...");
	}

}

动态代理

Java提供的动态代理(被代理对象必须有接口)
cglib提供动态代理(创建被代理对象的子类)
AOP的核心就是动态代理,如果存在接口则使用Java,否则使用cglib去实现动态代理;

 

package com.pattern.proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler{

	private Object obj;
	public MyInvocationHandler(Object obj){
		this.obj=obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("invoke before...");
		Object result=method.invoke(obj, args);//被代理对象方法的执行
		System.out.println("invoke after...");
		return result;
	}

}

 

package com.pattern.proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {

	public static void main(String[] args) {
		Lenovo l=new Lenovo();
		InvocationHandler invocationHandler=new MyInvocationHandler(l);//动态代理联想
		//创建联想的代理对象lenovoSale
		Sales lenovoSale=(Sales) Proxy.newProxyInstance(l.getClass().getClassLoader(), l.getClass().getInterfaces(), invocationHandler);
		lenovoSale.sale();
	}
}

缺点:如果一个类没有接口,则不能使用Java中的动态代理!


使用OOP中的继承关系,实现代理模式:

package com.pattern.proxy3;

public class Person {

	public void sayHello(){
		System.out.println("hello,person...");
	}
}

 

package com.pattern.proxy3;

public class PersonSon extends Person{

	@Override
	public void sayHello() {
		System.out.println("before...");
		super.sayHello();
		System.out.println("after...");
	}
}

 

package com.pattern.proxy3;

public class Test {

	public static void main(String[] args) {
		Person p=new PersonSon();
		p.sayHello();
	}
}

cglib(asm原理的简化)提供代理(动态产生被代理对象的子类

hibernate,spring里都用到的包
添加jar包!!spring里的lib中含有cglib

package com.pattern.proxy4;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyMethodInterceptor implements MethodInterceptor{

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		System.out.println("cglib before...");
		Object result=methodProxy.invokeSuper(obj, args);
		System.out.println("cglib after...");
		return result;
	}

}

 

package com.pattern.proxy4;

public class Person {

	public void sayHello(){
		System.out.println("hello....");
	}
}

 

package com.pattern.proxy4;

import net.sf.cglib.proxy.Enhancer;

public class Test {
	public static void main(String[] args) {
		Enhancer enhancer=new Enhancer();
		enhancer.setSuperclass(Person.class);
		enhancer.setCallback(new MyMethodInterceptor());
		
		Person p=(Person) enhancer.create();
		p.sayHello();
		
	}
}

 

 

分享到:
评论

相关推荐

    JAVA 23种设计模式(全).Design Pattern_Java模式

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。 3. **行为型模式**(Behavioral Patterns):...

    代理模式 Proxy Pattern

    ### 代理模式 Proxy Pattern #### 概念定义 代理模式是一种结构型设计模式,它允许程序员为某对象创建一个代理对象来控制对该对象的访问。简单来说,就是在不修改原始类的基础上,通过引入代理对象来扩展类的行为...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的功能或控制访问。 代理模式分为两种...

    Proxy Pattern 代理模式

    Proxy Pattern 代理模式 采用JAVA实现,可以下载看看。

    Android设计模式之代理模式(Proxy Pattern)

    Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口可以实现动态代理。动态代理在Android中常用于实现事件监听、AOP(面向切面编程)等场景。 **Android中的应用** 1. **数据加载**...

    设计模式 之 “代理模式[Proxy Pattern]”

    **代理模式(Proxy Pattern)**是软件设计模式中的结构型模式之一,它在对象访问控制、增加额外功能或在客户端与目标对象之间提供一个中介等方面有广泛的应用。在代理模式中,代理类作为真实对象的代表,它持有真实...

    代理模式(Proxy Pattern)完整示例代码

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类,并在代理类中调用目标类的方法。这种代理方式的优点是简单易懂,但缺点是如果目标类接口增加,所有...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    8. **代理模式(Proxy Pattern)**:为其他对象提供一种代理以控制对这个对象的访问,比如远程代理、虚拟代理、缓存代理等。 9. **桥接模式(Bridge Pattern)**:将抽象部分与它的实现部分分离,使它们都可以独立...

    Pattern_Program_Java

    9. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。在Java中,静态代理和动态代理(JDK Proxy和CGLIB)都是常见的实现方式。 10. **桥接模式(Bridge)**:将抽象部分与实现部分分离,使...

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    用Java实现23种设计模式

    代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式...

    JAVA design pattern-java设计模式

    结构型模式涉及到如何组合类和对象以形成更大的结构,例如适配器(Adapter)、装饰器(Decorator)、桥接(Bridge)、组合(Composite)、外观(Facade)、享元(Flyweight)和代理(Proxy)。这些模式有助于改善...

    33种JAVA设计模式DEMO

    代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...

    java设计模式详解,java design pattern

    3. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 4. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。 5. 外观模式(Facade Pattern):为子系统中的一...

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

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

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    4. **代理模式(Proxy Pattern)**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,我们可以使用动态代理(`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`)或者静态代理...

    JavaPattern_hw_02_2

    本作业“JavaPattern_hw_02_2”着重于五个结构型设计模式:适配器(Adapter)、代理(Proxy)、装饰器(Decorator)、外观(Facade)和享元(Flyweight)。这些模式都是为了提升代码的灵活性、可维护性和重用性。 1...

Global site tag (gtag.js) - Google Analytics