`
junjunbest
  • 浏览: 40147 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

设计模式之Proxy

阅读更多
继续学习代理模式:
   我要找咱公司老总办事,可无奈,我认识他,他不认识我,无法直接找到他,这件事眼看就要黄。这时突然想起,咱之前给老总的秘书小刘跑过腿,咱可以试试通过小刘来帮我把礼送到老总那,看能不能同样把事情办好。这秘书小刘平常在公司就经常挂着个牌子,找老总办事,先通过我。。。
   现实中,代理模式的例子举不胜举,比如销售代理也是最常见的一种,这里我们举一个电脑销售的例子,来简单的学习一下代理模式的核心思想。

一。提供一个公共接口,真实的对象(被代理对象)--电脑厂商以及代理对象--电脑代理商都具有销售掉闹的方法。
public interface SaleComputer {

	public void sale();
}


二。真实对象(被代理对象)--电脑厂商,实现公共接口
public class ComputerMaker implements SaleComputer {

	public void sale() {
		System.out.println("电脑卖给你");

	}

}


三。代理对象--电脑代理商,也实现该接口,并持有被代理对象的一个引用,并在公共接口方法里调用真实对象的方法,并且增加自己的特有内容

public class ComputerProxy implements SaleComputer {
	private ComputerMaker maker;
	
	/*public ComputerMaker getMaker(){
		if(null == maker){
			maker = new ComputerMaker();
		}
		return maker;
	}*///通常此方法对客户是不可见的,不然,咱直接就找电脑商买了~~
	public void sale() {
		preSale();
		if(null == maker){
			maker = new ComputerMaker();
		}
		maker.sale();
		postSale();

	}
	
	public void preSale(){
		System.out.println("来代理商这里买就送你一个鼠标");
	}
	
	public void postSale(){
		System.out.println("代理商送你一个鼠标");
	}

}


四。客户端,测试一下
public class Client
{
    public static void main(String[] args)
    {
    	ComputerProxy proxy = new ComputerProxy();
    	proxy.sale();
    }
}



以上是最简单的代理模式的一个例子了,但却也包含了代理模式的实质内涵。

接着是动态代理:被代理对象可以在运行时动态改变,需要控制的接口可以在运行时改变,控制的方式也可以动态改变,从而实现了非常灵活的动态代理关系。
动态代理的适用场合:调试;RMI调用
动态代理的创建步骤:1.创建一个实现java.lang.reflect.InvocationHandler接口的类,并实现invoke方法
2.创建被代理的类以及接口
3.通过java.lang.reflect.Proxy的静态方法newProxyInstance创建一个代理。
4.通过代理调用公共接口方法(会自动调用invoke方法)

我们仍然使用电脑代理商的例子:
1.创建一个实现InvocationHandler接口的代理手柄(ProxyHandler)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler {
	private Object obj;//这里是Object类型的引用,使得在运行时动态加
           //载被代理对象
	public ProxyHandler(Object obj){
		this.obj = obj;
	}
	

	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
		String type = (String) arg2[0];
		if("联想"==type||"华硕"==type){
			preInvoke();
			arg1.invoke(obj, arg2);
			postInvoke();
		}
		else System.out.println("这里没有"+type+"牌子的电脑");
		return null;
	}
	
	public void preInvoke(){
		System.out.println("来代理商这里买就给送你一个鼠标");
	}
	
	public void postInvoke(){
		System.out.println("代理商送你一个鼠标");
	}

}

2.创建真实对象(ComputerMaker)和公共接口(SaleComputer)

public interface SaleComputer {

	public void sale(String type);
}



public class ComputerMaker implements SaleComputer {

	public void sale(String type) {
		System.out.println("卖给你一台"+type+"电脑");

	}

}

3.创建一个客户端来测试
import java.lang.reflect.Proxy;

public class Buyer {


	public static void main(String[] args) {
		ComputerMaker maker = new ComputerMaker();
		Class<?> classType = maker.getClass();
		ProxyHandler handler = new ProxyHandler(maker);
		SaleComputer proxy = (SaleComputer) Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), handler);
		proxy.sale("Dell");
	}

}



动态代理还是相当重要的,其实原理还是基于反射。
分享到:
评论

相关推荐

    JAVA设计模式chm文档

    设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...

    二十三种设计模式【PDF版】

    设计模式之 Proxy(代理) 以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) ...

    设计模式文档 chm

    设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...

    GoF 23种设计模式的详解与应用

    结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite(组合),设计模式之Decorator(油漆工),设计模式之Bridge,设计模式之Flyweight(享元). 行为模式:设计模式之...

    设计模式C++学习之代理模式(Proxy)

    代理模式是一种设计模式,它是结构型模式之一,主要用于在客户端和目标对象之间建立一个代理对象,以便控制对目标对象的访问。在C++中,代理模式可以用来为其他对象提供一种代理以控制对这个对象的访问,或者增加...

    设计模式之代理模式proxy.zip

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色。代理模式允许我们为一个对象创建一个代理,这个代理对象在客户端和目标对象之间起到中介的作用,可以增强或控制对目标对象的访问。代理模式的主要...

    设计模式之代理模式proxy

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

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

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

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

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

    Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是...对于Java开发者来说,掌握设计模式是提升专业技能的关键步骤之一。

    C++设计模式之Proxy模式(代理模式)详解

    代理模式很容易理解,就是代替别人去做某一件事,打个比方,我们需要买水果,一般是去超市或者水果店买水果,很少有人去果园买水果,果园是生产水果的地方,但很少出售水果,在这里,水果店,超市就成了代理。...

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

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

    在软件工程中,设计模式是一种解决常见问题的模板或最佳实践,它被广泛应用于各种编程语言,包括Android开发。代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者...

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

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

    JavaScript设计模式与开发实践.pdf

    由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    23种设计模式整理pdf

    设计模式详解 设计模式是软件开发中的一种解决方案,旨在提高代码的可重用性、可维护性和可扩展性。在这篇文章中,我们将对23种常见的设计模式进行整理和解释。 1. Singleton 模式 Singleton 模式是一种创建型模式...

Global site tag (gtag.js) - Google Analytics