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

代理模式(Proxy pattern)
核心作用:

通过代理,控制对对象的访问
可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后
做后置处理(即:AOP的微观实现)

----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制

--核心角色:

抽象角色:
  定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口)
真实角色
  实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用
代理角色
  实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现
  抽象方法,并可以附加自己的操作(外部只会去访问代理类,代理再调用真实角色的方法)

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

静态代理容易实现(省略)
动态代理(JDK自带的实现)
--java.lang.reflect.Proxy
  作用:动态生成代理类和对象
--java.lang.reflect.InvocationHander(处理器接口)
  可以通过invoke方法实现对真实角色的代理访问
  每次通过Proxy生成代理类对象时都要指定对应的处理器对象

动态代理实例:

package com.luruixiao.pattern.dynamicProxy;

public interface Star {
	/**
	  *面谈
	 */
	void confer();
	/**
	 * 签合同
	 */
	void signContract();
	/**
	 * 订票
	 */
	void bookTicket();
	/**
	 * 唱歌
	 */
	void sing();
	/**
	 * 收钱
	 */
	void collectMoney();
}

  

package com.luruixiao.pattern.dynamicProxy;

public class RealStar implements Star{

	@Override
	public void confer() {
		System.out.println("RealStar.confer()");
	}

	@Override
	public void signContract() {
		System.out.println("RealStar.signContract()");
	}

	@Override
	public void bookTicket() {
		System.out.println("RealStar.bookTicket()");
	}

	@Override
	public void sing() {
		System.out.println("本人RealStar.sing()");
	}

	@Override
	public void collectMoney() {
		System.out.println("RealStar.collectMoney()");
	}

}

  

package com.luruixiao.pattern.dynamicProxy;

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

public class StarHandler implements InvocationHandler{

	Star realStar;

	public StarHandler(Star realStar) {
		super();
		this.realStar = realStar;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object obj = null;
		System.out.println("真正方法执行前");
		System.out.println("面谈,签合同,预付款,订机票");
		if(method.getName().equals("sing")) {
			obj = method.invoke(realStar, args);
		}
		System.out.println("真正方法执行后");
		System.out.println("收尾款");
		return obj;
	}

}

  

package com.luruixiao.pattern.dynamicProxy;

import java.lang.reflect.Proxy;

public class Client {
	public static void main(String[] args) {
		Star realStar = new RealStar();
		StarHandler handler = new StarHandler(realStar);

		Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {Star.class},handler);
//		proxy.bookTicket();
		proxy.sing();
	}
}

  

原文地址:https://www.cnblogs.com/lrxvx/p/9407344.html

时间: 2024-07-30 17:30:26

设计模式之结构型--代理模式的相关文章

设计模式之结构型桥接模式

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦. function changeColor(dom, color, bg) { // 设置元素的字体颜色 dom.style.color = color; // 设置元素的背景颜色 dom.style.background = bg; } var spans = document.getElementsByTagName('span'); spans[0].onmouseover = function() { changeColor(t

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

【转】设计模式(十一)代理模式Proxy(结构型)

设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

《设计模式》结构型模式1

上篇博文写了创建型模式中的(工厂家族).这次来介绍一下结构型模式.主要从各个模式的含义,优缺点,适用场合及结构图来了解结构型模式. 结构型模式包括有7种模式,适配器模式,外观模式,代理模式,桥接模式,享元模式,组合模式,装饰模式.每个模式各有优缺,孰优孰劣,请看下文. 1.适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构图: 适用于:想要使用一个已存在的类,但接口和你的要求不同时 在软件开发后期或是维护时期,在双方都不

设计模式总结-结构型模式

描述: 如何组合类和对象以获得最大的结构: 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法: 分类: 适配器模式 http://blog.csdn.net/huo065000/article/details/22177651 装饰模式 http://blog.csdn.net/huo065000/article/details/22061403 代理模式 http://blog.csdn.net/huo065000/article/details/22177

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对