Dota兄订餐——静态代理(java)

简介:        理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣。        代理模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理。

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

       代理模式是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,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个接口和对应的代理类,这也是静态代理的弊端。如何解决这个弊端呢?请期待我的下一篇博文



      

目录
相关文章
|
10月前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
359 13
|
SQL 前端开发 Java
JSP网上订餐管理系统myeclipse开发sql数据库BS模式java编程servlet技术mvc框架
JSP 网上订餐管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助servlet技术mvc框架,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
152 0
|
算法 Java 关系型数据库
jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目
jsp 网上订餐系统是一套完善的java web信息管理系统 servlet+dao+bean 开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发 。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。
113 0
jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目
|
19天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
58 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
84 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
3月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
307 83
|
3月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
144 0