`
gong1208
  • 浏览: 557121 次
  • 性别: 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设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码

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

    http://blog.csdn.net/t1234xy4/article/details/52729467

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

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

    设计模式代码——c#

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

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

    代码实现代理模式。具体文章简介可以参考博文:http://blog.csdn.net/lovefqing/article/details/8270111

    java 设计模式 静态代理模式

    //代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    Java设计模式 版本2

    设计模式之代理模式,请求的链式处理——职责链模式,请求发送者与接收者解耦——命令模式,自定义语言的实现——解释器模式,遍历聚合对象中的元素——迭代器模式,协调多个对象之间的交互——中介者模式,撤销功能...

    Python设计模式之代理模式实例详解

    设计模式——代理模式 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 实现:戴励 替 卓贾易 送礼物给 娇娇 模型: #公共接口类 class InterFace: def request(self): pass #真实类 cla

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    深入浅出设计模式(中文版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    深入浅出设计模式(中文版电子版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    24种设计模式介绍与6大设计原则

    二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...

    设计模式--可复用面向对象软件的基础

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

    C#23种设计模式_示例源代码及PDF

    代理模式 代理模式给某一个对象提供一个代理对象, 代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户 不想 或者不能够直接引用一个对象, 代理对象可以在客户和目标对象直接起到中介的...

    JavaScript模式中文[pdf] 百度云

     第7章 设计模式  单体模式  工厂模式  迭代器模式  装饰者模式  策略模式  外观模式  代理模式  中介者模式  观察者模式  小结  第8章 DOM和浏览器模式  关注分离  DOM脚本  事件  长期运行脚本  ...

    设计模式Demo

    二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

Global site tag (gtag.js) - Google Analytics