`

代理模式(Proxy Pattern)

 
阅读更多

代理模式(Proxy Pattern)是常用的设计模式之一,也是应用最广的设计模式。在Spring,RPC通讯方面经常使用。

 

代理模式主要的目的是在不修改原有接口实现的基础上,增强现有实现的能力,如加入认证,权限控制,日志等能力。主要通过新增一个proxy类,实现原实现类的接口,同时注入原实现类,代理原实现类的方法调用,同时在调用原实现类的时候在proxy类中增强原实现类的能力。

 

 

 

 

JAVA Demo

 

package demo.proxypattern;

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

/**
 * 代理模式实例
 * 
 * @author zhangpu
 * 
 */
public class ProxyPattern {

	/**
	 * 服务接口
	 * 
	 * @author zhangpu
	 * 
	 */
	static interface Service {
		public void doBusiness();
	}

	/**
	 * 服务正常实现类
	 * 
	 * @author zhangpu
	 * 
	 */
	static class ServiceImpl implements Service {
		@Override
		public void doBusiness() {
			System.out.println("do business");
		}
	}

	/**
	 * 静态代理增强服务
	 * 
	 * @author zhangpu
	 * 
	 */
	static class ServiceProxy implements Service {
		private Service service;

		public ServiceProxy(Service service) {
			super();
			this.service = service;
		}

		/**
		 * 增强原始类实现
		 */
		@Override
		public void doBusiness() {
			// 添加附加处理
			checkPremission();
			// 调用原始
			service.doBusiness();
			writeLogger();
		}

		private void checkPremission() {
			System.out.println("check premission");
		}

		private void writeLogger() {
			System.out.println("write log");
		}
	}

	/**
	 * JDK 动态代理 增强服务
	 * 
	 * @author zhangpu
	 * 
	 */
	static class ServiceJDKDynamicProxy implements InvocationHandler {
		private Object object;

		public Object getProxy(Class<?> clasz) {
			try {
				this.object = clasz.newInstance();
			} catch (Exception e) {
				// TODO: handle exception
			}
			return Proxy.newProxyInstance(clasz.getClassLoader(), clasz.getInterfaces(), this);
		}

		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			checkPremission();
			Object result = method.invoke(object, args);
			writeLogger();
			return result;
		}

		private void checkPremission() {
			System.out.println("check premission");
		}

		private void writeLogger() {
			System.out.println("write log");
		}

	}

	public static void main(String[] args) {
		System.out.println("Original:");
		Service service = new ServiceImpl();
		service.doBusiness();

		System.out.println();
		System.out.println("Static proxy:");
		Service proxy = new ServiceProxy(service);
		proxy.doBusiness();

		System.out.println();
		System.out.println("Dynamic proxy:");
		Service dynamicProxy = (Service) new ServiceJDKDynamicProxy().getProxy(ServiceImpl.class);
		dynamicProxy.doBusiness();
	}
}
 
分享到:
评论

相关推荐

    代理模式 Proxy Pattern

    ### 代理模式 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、适配器...

    Proxy Pattern 代理模式

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

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

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

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

    代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...

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

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

    设计模式之代理模式proxy

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

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

    代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象可以在原对象进行某些操作之前或之后添加额外的功能。代理模式的核心在于,它提供了一种方式来间接访问或控制目标对象,增加了系统的...

    c++-设计模式之代理模式(Proxy)

    代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于保护、延迟加载、记录请求等场景,可以在不改变原有对象的情况下为其增加新的功能。 代理...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    设计模式专题,代理模式,工厂模式

    **代理模式(Proxy Pattern)** 代理模式的核心思想是在原始对象和客户端之间插入一个代理对象,这个代理对象在客户端和原始对象之间起到中介作用,可以控制或扩展对原始对象的访问。在Java中,代理模式主要有静态...

    C++设计模式课件15_Proxy_代理模式.pdf

    代理模式(Proxy Pattern)是一种结构型设计模式,它在客户端与目标对象之间提供了一个代理对象。这个代理对象能够控制对目标对象的访问,并且可以添加额外的功能或操作。简而言之,代理模式的核心在于提供一个代理...

    C#设计模式_设计模式_C#_

    代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18....

    用Java实现23种设计模式

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

    设计模式代理模式PPT学习教案.pptx

    代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象以控制对另外一个对象的访问。代理对象充当着中间人的角色,帮助客户端访问目标对象,并可以在访问过程中添加一些额外的操作。 知识点2:代理...

    设计模式PPT

     代理模式(Proxy Pattern) 行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:  责任链模式(Chain of Responsibility Pattern)  命令模式(Command Pattern)  解释...

    js策略模式和代理模式

    代理模式(Proxy Pattern)是一种结构设计模式,它为另一个对象提供一个代理或占位符以控制对这个对象的访问。代理模式中的代理对象和目标对象实现相同的接口,客户端与代理对象进行交互,代理对象则根据具体情况...

    设计模式代码——c#

    12. 代理模式(Proxy Pattern) 行为型 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器模式(Iterator Pattern) 16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter ...

Global site tag (gtag.js) - Google Analytics