设计模式(二)——代理模式
本文讲述的是代理模式
我们假设有如下一种场景:
有关水果的销售,有三种角色:顾客,批发商,果农,大城市里的顾客想要买某种水果,不会直接去找果农,他会找对应的批发商(顾客可以是单个消费者也可以是零售商,这个没差别),批发商会将相应的水果卖给顾客,但是实际上批发商是不生产水果,他只不过是在代果农销售水果而已,而且批发商可以销售各种水果,消费者也只需要通过批发商就可以买到不同果农生产的水果。
下面我们就看如何用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接口,然后让这个代理商代理香蕉(就是在构造函数里注入这个对象),那顾客就可以买到香蕉了。
分享到:
相关推荐
设计模式——代理模式源码,设计模式——代理模式源码
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
http://blog.csdn.net/t1234xy4/article/details/52729467
浅析Java设计模式【3】——代理.pdf
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
代码实现代理模式。具体文章简介可以参考博文:http://blog.csdn.net/lovefqing/article/details/8270111
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
设计模式之代理模式,请求的链式处理——职责链模式,请求发送者与接收者解耦——命令模式,自定义语言的实现——解释器模式,遍历聚合对象中的元素——迭代器模式,协调多个对象之间的交互——中介者模式,撤销功能...
设计模式——代理模式 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 实现:戴励 替 卓贾易 送礼物给 娇娇 模型: #公共接口类 class InterFace: def request(self): pass #真实类 cla
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第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...
二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
代理模式 代理模式给某一个对象提供一个代理对象, 代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户 不想 或者不能够直接引用一个对象, 代理对象可以在客户和目标对象直接起到中介的...
第7章 设计模式 单体模式 工厂模式 迭代器模式 装饰者模式 策略模式 外观模式 代理模式 中介者模式 观察者模式 小结 第8章 DOM和浏览器模式 关注分离 DOM脚本 事件 长期运行脚本 ...
二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...
java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...