`
gong1208
  • 浏览: 559078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式(二)——代理模式

阅读更多

设计模式(二)——代理模式

 

本文讲述的是代理模式

我们假设有如下一种场景:

         有关水果的销售,有三种角色:顾客,批发商,果农,大城市里的顾客想要买某种水果,不会直接去找果农,他会找对应的批发商(顾客可以是单个消费者也可以是零售商,这个没差别),批发商会将相应的水果卖给顾客,但是实际上批发商是不生产水果,他只不过是在代果农销售水果而已,而且批发商可以销售各种水果,消费者也只需要通过批发商就可以买到不同果农生产的水果。

下面我们就看如何用java代码实现:

我们先定义类出售水果的人的接口,他们都有一个共同的方法,卖水果:

 

package com.gy.designpattern.proxy;
/**
 * ClassName:IFruitSeller <br/>
 * Function: 这是一个水果卖家的接口,果农和批发商都是这类人,他们都可以卖水果. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-3 下午5:25:07 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public interface IFruitSeller {

	/**
	 * sellFruit:出售水果. <br/>
	 * @author gongyong
	 * @since JDK 1.6
	 */
	public void sellFruit();

}

 然后我们定义个种苹果的果农,他实现了该接口:

package com.gy.designpattern.proxy;
/**
 * ClassName:ApplerFarmer <br/>
 * Function: 苹果种植者. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-3 下午5:29:54 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class AppleFarmer implements IFruitSeller{

	/**
	 * 苹果种植者要出售他的水果.
	 * @see com.gy.designpattern.proxy.IFruitSeller#sellFruit()
	 */
	@Override
	public void sellFruit(){
		System.out.println("我卖苹果,3块钱一斤");
	}
}
 

  再定义一个种西瓜的:

package com.gy.designpattern.proxy;
/**
 * ClassName:WatermelonFarmer <br/>
 * Function: 西瓜种植者. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-3 下午5:32:08 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class WatermelonFarmer implements IFruitSeller{

	/**
	 * 西瓜种植者要出售他的西瓜.
	 * @see com.gy.designpattern.proxy.IFruitSeller#sellFruit()
	 */
	@Override
	public void sellFruit(){
		System.out.println("我卖西瓜,1块2一斤");
	}

}

 然后我们定义一个批发商:

package com.gy.designpattern.proxy;
/**
 * ClassName:Wholesalers <br/>
 * Function: 批发商,直接销售水果给顾客. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-3 下午5:34:31 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class Wholesalers implements IFruitSeller{

	private IFruitSeller fuitSeller;

	/**
	 * 该批发商默认的是销售苹果种植者的苹果.
	 *
	 */
	public Wholesalers(){
		this.fuitSeller=new AppleFarmer();
	}


	/**
	 * 批发商也可以销售其他水果种植者的水果.
	 *
	 * @param fruitSeller
	 */
	public Wholesalers(IFruitSeller fruitSeller){
		this.fuitSeller=fruitSeller;

	}

	/**
	 * 我是批发商,我可以卖各种水果,但是实际上我没有水果,真正卖水果的是果农.
	 * @see com.gy.designpattern.proxy.IFruitSeller#sellFruit()
	 */
	@Override
	public void sellFruit(){
		this.fuitSeller.sellFruit();
	}

}

 最后就是顾客,顾客来了要买水果,直接找批发商就好了,他不需要知道果农:

package com.gy.designpattern.proxy;
/**
 * ClassName:Customer <br/>
 * Function: 顾客(批发商的顾客可以是消费者,也可以是零售商). <br/>
 * Reason:	 顾客不会直接找果农买水果,他会找代理商. <br/>
 * Date:     2012-7-3 下午5:44:54 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class Customer {

	public static void main(String[] args){
		// 顾客不会直接找果农买水果,他会找代理商,所以我们先new出代理商
		Wholesalers appleSalers=new Wholesalers();
		//这家代理商默认是卖苹果的,所以顾客来这里买苹果
		System.out.println("-----我要买苹果-----");
		appleSalers.sellFruit();

		//然后顾客想要买西瓜,就找到卖西瓜的代理商
		Wholesalers watermelonSalers=new Wholesalers(new WatermelonFarmer());

		//这家代理商卖西瓜,我在这里买
		System.out.println("-----我要买西瓜-----");
		watermelonSalers.sellFruit();
	}
}
 

OK,到这里就完成了,可以看出,顾客可以有多种需求,而顾客唯一要打交道的就是代理商,而代理商是可以代理各种类型的商品的,如果现在顾客需要买香蕉,那我们只需要定义一个生产香蕉的果农实现IFruitSeller接口,然后让这个代理商代理香蕉(就是在构造函数里注入这个对象),那顾客就可以买到香蕉了。

分享到:
评论
2 楼 gong1208 2012-08-30  
yuan198906030 写道
spring注入的业务bean,是代理类吗?

对的,spring的注入bean用到是jdk的默认的动态代理!spring产生代理的方式有两种,第一种是实现了接口的类,会使用默认的jdk产生,该方式通过实现目标类的接口,产生一个aop代理类,该aop代理类可能封装了些事务处理,和目标类的方法,所以我们在拿出这个bean的时候,其实是这个aop代理。第二种情况目标类没有实现任何接口,产生代理的方法是CGLIB的字节码生成,该方式是通过产生目标类的子类,产生一个aop代理类,该类也封装了一些事务和目标类的方法,当我们取出的时候,其实也是aop代理类,只不过是目标类的子类
1 楼 yuan198906030 2012-08-29  
spring注入的业务bean,是代理类吗?

相关推荐

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

    设计模式——代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色。代理模式的主要思想是为一个对象提供一个替身或代表,以便控制对该对象的访问。这个代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    设计模式——刘伟

    6. **代理模式**:为其他对象提供一种代理以控制对该对象的访问。代理可以在目标对象前增加额外的功能,如缓存、日志记录、事务控制等。 7. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    设计模式——GFour

    《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...

    设计模式——原版的设计模式

    代理模式为其他对象提供一种代理以控制对这个对象的访问;组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。 3. **行为型模式**:这类模式涉及对象之间的责任分配。命令模式将请求封装为一个对象,从而...

    PHP设计模式介绍——CHM

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任链模式:避免将请求的发送者与接收者耦合在一起,多个对象可以处理同一个请求。 - 命令模式:将请求封装为一个对象,...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

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

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    iOS设计模式——委托(delegate)例子

    在iOS开发中,设计模式是实现高效、可维护和可扩展代码的关键元素。本文将重点关注“委托”(Delegate)设计模式,这是一种常见的模式,用于在对象之间建立通信和协调行为。通过实现委托,一个对象(委托者)可以...

    设计模式——可复用面向对象软件的基础(1)

    在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...

Global site tag (gtag.js) - Google Analytics