理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣。

代理模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理。

代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。它可以为委托对象预处理消息,过滤消息并转发消息,以及进行消息被委托对象执行后的后续处理,

或许有人会疑惑,为什么不直接用呢,非得需要代理呢?我们看下面一个场景:


"商女不知亡国恨;一天到晚打Dota;举头望明月,低头打Dota;洛阳亲友如相问,就说我在打Dota;少壮不努力,老大打Dota;垂死病中惊坐起,今天还没打Dota;生当作人杰,死亦打Dota;人生自古谁无死,来生继续打Dota。。。"

这就是当今大学男生宿舍的概况。小蔡是XX大学的计算机系大四学生,上面说的“歌谣”,也是他的大学生涯的真是写照。人称“小菜”,技术也真是菜到了家,不过却是“越挫越勇”,一天到晚打Dota,吃饭也不离开宿舍,一个电话搞定。这不,又来了:

啪的一拍键盘,“呼,终于赢了,差点让对方给办了,幸好对方的幽鬼被女朋友给拽走了。。。”,一看时间,“呀,都11点40了,不知不觉中又该吃饭啦”,嘀咕了一声,在被子里摸索了半天,抄起“王牌手机”诺基亚1100,拨通了那个无比熟悉的号码。。。

“喂,饭(范)哥,我是蔡哥呀。。。。嗯,对,对,还是Dota套餐,好,快点呀,挂了!”

范哥也是大四学生,从大一就开始做“代理订餐”的业务,已经有不小的“业绩”和很好的口碑了,人称“饭哥”。

10分钟,饭到,5分钟饭毕,然后菜哥又开始他伟大的Dota生涯了。。。。


情景结束。

在上面的情景中,食堂卖饭,范哥也卖饭,不过范哥卖的却是从食堂倒手而来的,小菜委托范哥去买,就相当于去食堂买饭了。这就是一个典型的代理模式。我们用代码和图说明一下:

源码:SellMeal.java 售饭接口

package com.bjpowernode.pattern.bookmeal;

/**
* 售饭接口
* @author Longxuan
*
*/
public interface SellMeal { /**
* 售饭方法
*/
public void sellRice(); }

Restaurant.java 餐厅类

package com.bjpowernode.pattern.bookmeal;

/**
* 餐厅
* @author Longxuan
*
*/
public class Restaurant implements SellMeal { /**
* 餐厅售饭
*/
@Override
public void sellRice() {
System.out.println("1份米饭,2份菜(凉+热),1份鸡蛋汤。");
} }

SellMealProxy.java 订餐代理类

package com.bjpowernode.pattern.bookmeal;

/**
* 订餐代理类,饭哥
* @author Longxuan
*
*/
public class SellMealProxy implements SellMeal { private SellMeal sellMeal = null; public SellMealProxy(SellMeal sellMeal){
this.sellMeal = sellMeal;
System.out.println("您好,我是订餐的范哥:");
} /**
* 订餐售饭
*/
@Override
public void sellRice() {
System.out.println("这是您的Dota套餐:");
sellMeal.sellRice();
System.out.println("欢迎您的惠顾。");
}
}

DotaGG.java 客户端类,订饭的Dota兄

package com.bjpowernode.pattern.bookmeal;

/**
* 客户端类,订饭的Dota兄
* @author Longxuan
*
*/
public class dotaGG { public static void main(String[] args){ //找代理食堂订饭的范哥
SellMealProxy FanGG = new SellMealProxy(new Restaurant()); //向范哥订饭
FanGG.sellRice();
}
}

运行结果:

从源码中可以看到,客户端通过代理访问到目标对象,从而避免了与目标对象的直接接触。所以Dota兄小菜不用自己去买饭,就可以吃到食堂的饭菜了,同时节省了时间。而范哥赚了点money,虽然不多,但是贵在“薄利多销”,而且在每次送餐,都有在不经意间打出广告。客户多自然利润多,也就有了其存在的价值。

也就是说,我们不是非得直接让原对象去访问目标对象,有时候那样并不好,不合适,或者现实生活中不可能出现那种情况。所以我们需要一个代理类,去帮助我们完成这些操作,而且这些代理还可以对消息预处理和后继处理。这就是代理存在的意义。

如果你细心些,会发现一个代理类服务一个接口。即有100个不同的目标对象,则需要用到100个接口和对应的代理类,这也是静态代理的弊端。如何解决这个弊端呢?请期待我的下一篇博文。

Dota兄订餐——静态代理(java)的更多相关文章

  1. java的静态代理和动态代理(jdk、cglib)

    一.代理模式 代理的概念来自于设计模式中的代理模式,先了解一下代理模式 1.结构图 2.参与者 Subject:接口,定义代理类和实际类的共用接口 RealSubject:实际类,实现Subject这 ...

  2. java静态代理与动态代理

    原文链接:http://www.orlion.ga/207/ 一.代理模式 代理模式是经常用到的设计模式,代理模式是给指定对象提供代理对象.由代理对象来控制具体对象的引用. 代理模式涉及到的角色: 抽 ...

  3. Java 的静态代理 动态代理(JDK和cglib)

    转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...

  4. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  5. Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接 ...

  6. [z]Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 ...

  7. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  8. java 代理模式一: 静态代理

    代理模式: 代理模式的作用:为其他对象提供一种代理以控制对 特定对象  的访问. 某种情况下,一个客户不想或者直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用:通过代理对象引用. ...

  9. Java:静态代理 and 动态代理

    代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并 ...

随机推荐

  1. hdoj 2040

    #include<stdio.h>int i,j,s1,s2;int cha(int a,int b){ s1=0; s2=0;   for(i=1;i<a;i++)   {    ...

  2. 【POJ3468】【zkw线段树】A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  3. yield用法的一点理解

    yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值,例如,在 foreach 语句的每一次循环中返回的值.yield 关键字也可与 break 结合使用,表示迭代结 ...

  4. jQuery常用技巧大放送

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  5. POJ2524-宗教问题-并查集-ACM

    太难的搞不过,只能来写简单的了 POJ2524 无所不在的宗教 世界上宗教何其多.假设你对自己学校的学生总共有多少种宗教信仰很感兴趣.学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的 ...

  6. Python开发【第一章】:Python简介和入门

    Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承. ...

  7. [r]Seven habits of effective text editing

    Seven habits of effective text editing(via) Bram Moolenaar November 2000 If you spend a lot of time ...

  8. linux c静态链接库与动态链接库

    库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...

  9. WCF返回JSON的详细配置

    开发环境:VS2008,c# 1.新建个WCF服务网站 文件-新建-网站-WCF服务 2,运行一下,提示配置WEB.CONFIG,点击确认. 3,打开web.config增加如下节点: <ser ...

  10. java单点登录系统CAS的简单使用

    转:http://blog.csdn.net/yunye114105/article/details/7997041 背景 有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在 ...