设计模式(二)——代理模式
本文讲述的是代理模式
我们假设有如下一种场景:
有关水果的销售,有三种角色:顾客,批发商,果农,大城市里的顾客想要买某种水果,不会直接去找果农,他会找对应的批发商(顾客可以是单个消费者也可以是零售商,这个没差别),批发商会将相应的水果卖给顾客,但是实际上批发商是不生产水果,他只不过是在代果农销售水果而已,而且批发商可以销售各种水果,消费者也只需要通过批发商就可以买到不同果农生产的水果。
下面我们就看如何用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编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。
代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色。代理模式的主要思想是为一个对象提供一个替身或代表,以便控制对该对象的访问。这个代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的...
### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...
6. **代理模式**:为其他对象提供一种代理以控制对该对象的访问。代理可以在目标对象前增加额外的功能,如缓存、日志记录、事务控制等。 7. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程...
"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...
### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...
代理模式为其他对象提供一种代理以控制对这个对象的访问;组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。 3. **行为型模式**:这类模式涉及对象之间的责任分配。命令模式将请求封装为一个对象,从而...
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. **行为型模式**: - 责任链模式:避免将请求的发送者与接收者耦合在一起,多个对象可以处理同一个请求。 - 命令模式:将请求封装为一个对象,...
基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。
在iOS开发中,设计模式是实现高效、可维护和可扩展代码的关键元素。本文将重点关注“委托”(Delegate)设计模式,这是一种常见的模式,用于在对象之间建立通信和协调行为。通过实现委托,一个对象(委托者)可以...
在《设计模式——可复用面向对象软件的基础》这本书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称GoF)首次提出了23种面向对象设计模式。这些模式涵盖了不同设计场景,如创建型模式、...