`

设计模式--代理模式

阅读更多

代理模式

代理模式 参考了iteye网友的一篇文章《java设计模式之——代理模式》

以下代码根据该思想改编

 

接口

public interface KindWoman {
	
	public void makeEyesWithMan();

	public void happyWithMan();
	
}

 

 实现类

public class Beauty implements KindWoman {

	@Override
	public void happyWithMan() {
		System.out.println("游戏...");
	}

	@Override
	public void makeEyesWithMan() {
		System.out.println("抛媚眼...");
	}
}

 

 代理类

public class UglyWoman implements KindWoman {

	private KindWoman kindWoman;

	public UglyWoman() {
		this.kindWoman = new Beauty();
	}

	// 她可以是KindWomam的任何一个女人的代理,只要你是这一类型
	public UglyWoman(KindWoman kindWoman) {
		this.kindWoman = kindWoman;
	}

	@Override
	public void happyWithMan() {
		this.kindWoman.happyWithMan();// 找人代理
	}

	@Override
	public void makeEyesWithMan() {
		this.kindWoman.makeEyesWithMan();// 找人代理
	}
}

 

 客户端代码

	public static void main(String[] args) {
		KindWoman woman = new UglyWoman();
		woman.makeEyesWithMan();
		woman.happyWithMan();
	}

 

处理延时加载

将代理类进行改造

public class UglyWoman implements KindWoman {

	private KindWoman kindWoman;

	public UglyWoman() {
		this.kindWoman = new Beauty();
	}

	// 她可以是KindWomam的任何一个女人的代理,只要你是这一类型
	public UglyWoman(KindWoman kindWoman) {
		this.kindWoman = kindWoman;
	}

	@Override
	public void happyWithMan() {
		if (kindWoman == null) {
			kindWoman = new Beauty();
		}
		this.kindWoman.happyWithMan();// 找人代理
	}

	@Override
	public void makeEyesWithMan() {
		if (kindWoman == null) {
			kindWoman = new Beauty();
		}
		this.kindWoman.makeEyesWithMan();// 找人代理
	}
}

 

public class Beauty implements KindWoman {

	//加入时间检测
	public Beauty() {
		try {
			Thread.sleep(3000);
			System.out.println("准备");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void happyWithMan() {
		System.out.println("游戏...");
	}

	@Override
	public void makeEyesWithMan() {
		System.out.println("抛媚眼...");
	}
}

 

客户端调用

		long currentTimeMillis = System.currentTimeMillis();
		
		KindWoman woman = new UglyWoman(null);
		
		long currentTimeMillis2 = System.currentTimeMillis();
		System.out.println(currentTimeMillis2 - currentTimeMillis);

		woman.makeEyesWithMan();//在调用具体的方法时,new一个新的对象
		woman.happyWithMan();

 

 

输出结果:

0       -- 休眠3秒,输出“准备”
准备
抛媚眼...
游戏...

 

 

提供额外的功能:AOP 动态代理

public interface Dog {

	public void info();

	public void run();
}

 

public class GunDog implements Dog {

	@Override
	public void info() {
		System.out.println("我是一只猎狗");
	}

	@Override
	public void run() {
		System.out.println("我奔跑迅速");
	}
}

 

 需要切入的代码

public class TxUtil {

	public void beginTx() {
		System.out.println("===模拟开始事务====");
	}

	public void endTx() {
		System.out.println("===模拟结束事务====");
	}

}

 

代理类

public class MyInvokationHandler implements InvocationHandler {
	//需要被代理的对象
	private Object target;

	public void setTarget(Object target) {
		this.target = target;
	}

	//执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		TxUtil tx = new TxUtil();
		tx.beginTx();

		Object result = method.invoke(target, args);
		tx.endTx();

		return result;
	}
}

  

/**
 * 为指定的target生成动态代理实例
 * 
 */
public class MyProxyFactory {

	public static Object getProxy(Object target) {

		MyInvokationHandler handler = new MyInvokationHandler();

		handler.setTarget(target);

		// 创建并返回一个动态代理
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), handler);

	}
}

 

客户端调用类

 

 
	public static void main(String[] args) {
		Dog target = new GunDog();

		Dog dog = (Dog) MyProxyFactory.getProxy(target);
		dog.info();
		dog.run();
	}

 

输出结果:

===模拟开始事务====
我是一只猎狗
===模拟结束事务====
===模拟开始事务====
我奔跑迅速
===模拟结束事务====

 

这种动态代理在AOP(面向切面编程)里被称为AOP代理,AOP代理可代理目标对象,包含了目标对象的全部方法,并且可以在执行目标方法之前、之后插入一些通用处理。

 

Spring所创建的AOP代理就是这种动态代理,通过配置文件来决定invoke()方法中需要调用哪些拦截器。

当程序需要为目标对象扩展新功能时,无需改变java代理,在配置文件中添加更多的拦截器配置即可。

 

代理模式的优势及使用场景:

客户端代码不能或者不想直接访问被调用对象:比如,创建系统开销很大的对象(延时加载),或者被调用的对象在远程主机上,或者目标对象的功能不能满足需求,这时候就需要创建一个代理对象,返回给客户端使用。

 

分享到:
评论

相关推荐

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

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

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

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

    设计模式-代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...

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

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

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

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

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

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

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

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

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

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

    Java设计模式-代理模式

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

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

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

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

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

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

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

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

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

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

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

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

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

    JAVA设计模式-chm版

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

    设计模式专题之(六)代理模式---设计模式代理模式示例代码(python--c++)

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,主要用来为其他对象提供一种代理以控制对这个对象的访问。在这个专题中,我们将深入探讨代理模式,并通过Python和C++两种语言来实现示例代码。 首先...

    C++设计模式-好书

    ### C++设计模式精解 #### 一、引言 设计模式是软件工程领域中一个非常重要的话题,它为解决常见的软件设计问题提供了标准化的方法。本书《C++设计模式》聚焦于GoF(Gang of Four)所提出的23种设计模式,并通过...

    设计模式课件大全

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

Global site tag (gtag.js) - Google Analytics