`
lvwenwen
  • 浏览: 931883 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

java设计模式之动态代理模式(结构型模式)

阅读更多

 

(8).代理模式:

文章链接:http://www.iteye.com/topic/517835

代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用. 

 

代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,

都是通过代理来完成他的销售业务的.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行了,

具体红酒工厂在那里,客户不用关心,代理会帮他处理. 

代理模式涉及的角色: 

1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 

2:代理主题角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,

使它可以随时代替真实主题.代理主题通过持有真实主题的引用,

不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作. 

3:真实代理对象.定义了代理角色所代表的具体对象. 

java主要是通过Proxy类和InvocationHandler接口来给实现对代理模式的支持的. 

,拦截机制是代理模式的重要使用方式之一, 

除了拦截,代理模式还常用于资源加载,当我们要加载的资源很大时,我们可以让真实主题角色在后台加载资源,让代理主题角色负责处理前台的等待提示信息. 

还有就是授权机制,通过代理能拦截真实主题的能力,来控制真实主题的访问权限.

讲到代理常常要讲到动态代理, 

如果代理是静态的,那么看起来和装饰器无二,所以代理常常都和动态以及反射联系在一起,总是和语言本身的能力有关…… 

代理模式通常是对原有对象的控制,不会增加新的行为,比如说原来干什么还是干什么,常见的比如cglib加上事务机制,但是没有增加新的行为,原有的服务未变。 

但是装饰模式通常会加上新的行为,而且行为可以动态进行组合,可以有任意顺序,比如给墙刷颜色,先刷底色,再刷红色,再刷绿色,也可以先刷底色,

再刷绿色,再刷红色。 

代理模式和装饰模式都可以构造成在新类中引用对原有类,构成原有类的委托,这样就可以对原有类进行控制了,可以加新的行为,也可以加上其他控制。 

不过有一点疑问,代理者和被代理者是聚合关系吗??聚合关系是整体和局部的关系,但是离开整体局部还可以生存,比如飞机场和飞机,

代理模式两者关系,我觉得应该是依赖关系,更像是user-a关系,正因为是依赖关系,所以我们使用接口进行了解耦,而不是显示依赖直接注入实现类 


package com.createtype.desginpatterns.dynaicproxyaopimp;
//接着,用代理模式实现一个超级简单的aop拦截机制 
//这个例子可以拦截我们指定的函数,并在拦截前后根据需要进行处理 
/**
*切面接口,通过实现这个接口,我们可以对指定函数在调用前后进行处理
*/
public interface AopInterface {
   public void before(Object obj);//调用的处理
   public void end(Object obj);//调用后的处理
}
package com.createtype.desginpatterns.dynaicproxyaopimp;

//这个是实现了AopInterface 接口,在这里我们实现了我们的处理逻辑 
public class AopInterfaceImp implements AopInterface{

    public void before(Object obj) {
        System.out.println("调用前拦截");
    }

    public void end(Object obj) {
        System.out.println("调用调用后处理");
    }

}
package com.createtype.desginpatterns.dynaicproxyaopimp;

public class ImpObject implements SubInterface{

    public void add(String value1,String value2) {
        System.out.println("ImpObject add(String value1,String value2)");
    }

    public void acc(String value1){
        System.out.println("ImpObject acc(String value1)");
    }
   
}

package com.createtype.desginpatterns.dynaicproxyaopimp;

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

public class PeoxyObject implements InvocationHandler {
	private AopInterface aop;// 定义了切入时调用的方法
	private Object proxy_obj;
	private String methodName;// 指定要切入的方法名

	PeoxyObject() {
	}

	public Object factory(Object obj) {
		proxy_obj = obj;
		Class cls = obj.getClass();
		return Proxy.newProxyInstance(cls.getClassLoader(),
				cls.getInterfaces(), this);
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		if (this.aop == null)
			throw new NullPointerException("aop is null");
		if (method == null)
			throw new NullPointerException("method is null");

		Object o;
		// 如果指定了要拦截方法名,并且调用的方法和指定的方法名相同,则进行拦截处理
		// 否则当正常方法处理
		if (methodName != null && method.toString().indexOf(methodName) != -1) {
			aop.before(proxy_obj);// 指定方法调用前的处理
			o = method.invoke(proxy_obj, args);
			aop.end(proxy_obj);// 指定方法调用后的处理
		} else {
			// 没有指定的方法,以正常方法调用
			o = method.invoke(proxy_obj, args);
		}
		return o;
	}

	public AopInterface getAop() {
		return aop;
	}

	public void setAop(AopInterface aop) {
		this.aop = aop;
	}

	public String getMethodName() {
		return methodName;
	}

	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}
}

package com.createtype.desginpatterns.dynaicproxyaopimp;
//这里定义一个用来测试用的类 
public interface SubInterface {
    public void add(String value1,String value2);
    public void acc(String value1);
}

package com.createtype.desginpatterns.dynaicproxyaopimp;

public class Test {
	// 这里是测试代码
	public static void main(String agr[]) {
		PeoxyObject po = new PeoxyObject();

		po.setAop(new AopInterfaceImp());// 我们实现的拦截处理对象
		po.setMethodName("acc");// 指定要拦截的函数

		SubInterface si = (SubInterface) po.factory(new ImpObject());
		// 因为add方法不是我们指定的拦截函数,AopInterfaceImp是不会被执行
		si.add("tt", "dd");

		// acc是我们指定的拦截方法,所以调用acc的前后会先执行AopInterfaceImp
		// 对象的两个方法
		si.acc("tt");
	}
}
 
分享到:
评论

相关推荐

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

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

    java 23种设计模式.zip

    2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略...

    《Java设计模式》源代码

    《Java设计模式》源代码.rar “结构型模式”中的“适配器模式”的定义、结构与使用。 “结构型模式”中的“桥接模式”的定义、结构与使用。 “结构型模式”中的组合模式的定义、结构与使用。 “结构型模式”中的装饰...

    java设计模式示例

    结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态...

    java常用23中设计模式

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    33种JAVA设计模式DEMO

    2 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) ...

    Java23种设计模式可直接运行Demo

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    Java设计模式每章源代码.zip

    “结构型模式”中的代理模式的定义、结构与使用。 “行为型模式”中的职责链模式的定义、结构与使用。 “行为型模式”中的命令模式的定义、结构与使用。 “行为型模式”中的解释器模式的定义、结构与使用。 “行为...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令...

    Java 设计模式

    结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态...

    23种JAVA设计模式和15种J2EE设计模式

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    Java设计模式整理

    java设计模式word整理,付代码说明,时候java进阶选手,欢迎选购! 目录 1 1. 设计模式 2 1.1 创建型模式 2 1.1.1 工厂方法 2 1.1.2 抽象工厂 4 1.1.3 建造者模式 6 1.1.4 单态模式 9 1.1.5 原型模式 10 1.2 结构型...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    java种设计模式详解

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    java设计模式

    java设计模式 介绍各种设计模式 目录 1. 设计模式 3 1.1 创建型模式 4 1.1.1 工厂方法 4 1.1.2 抽象工厂 6 1.1.3 建造者模式 10 1.1.4 单态模式 13 1.1.5 原型模式 15 1.2 结构型模式 17 1.2.1 适配器模式 17 1.2.2 ...

    23种设计模式java源码

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    Java设计模式

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

    Java23种设计模式

    1.2 结构型模式 17 1.2.1 适配器模式 17 1.2.2 桥接模式 19 1.2.3 组合模式 23 1.2.4 装饰模式 26 1.2.5 外观模式 29 1.2.6 享元模式 32 1.2.7 代理模式 34 1.3 行为型模式 37 1.3.1 责任链模式 37 1.3.2 命令模式 ...

    设计模式的精简版

    结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式共七种。 行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,...

    java23种设计模式总结

    java23种设计模式总结 . 设计模式 1.1 创建型模式 ...1.2 结构型模式 ... 1.2.1 适配器模式 1.2.2 桥接模式 ...... 1.2.3 组合模式 1.2.4 装饰模式 1.2.5 外观模式 . 1.2.6 享元模式 1.2.7 代理模式

Global site tag (gtag.js) - Google Analytics