中介公司的故事(一)-Java静态代理
小育是国内某省会城市211流大学毕业的计算机系学生。毕业后通过中介钟么办在一个叫链表家的中介公司租到了房子。链表家的老板肖坡廉想把这中介公司发展成一家互联网中介公司。租房子的时候看上了小育计算机系毕业的文凭,于是把他招到链表家当程序员,这样小育成了链表家第一位程序员。上班第一天,小育遇见了当时帮他租房子的中介钟末办,钟末办一脸惆怅的说:“我房子卖的好好的,就因为我以前是计算机系毕业的,老板非要让我来当什么产品经理,工资是高了点,提成全没了。最近楼市这么火,这不是坑我吗”?“小育你先给寡人写一个简单的租房子的程序”。“这个问题很简单”小育自信的回答道。经理说:“do not blind BB, show me the code”。
HouseOwner.java
public class HouseOwner { private String name; public HouseOwner (String name){ this.name = name; } //房屋出租 public void rent(){ System.out.println("租得"+name+"的房屋。"); } } |
Client.java
public class Client { public static void main(String[] args) { HouseOwner houseOwner = new HouseOwner ("房主"); //客户通过自己,租的房主的房屋。 houseOwner .rent(); } } |
运行结果:
租得房主的房屋。 |
经理看完代码后,有点疑惑的说“小育啊,我总觉得这代码哪里有问题,但是我大学计算机也总挂科,HelloWorld都只能写一半。所以才来搞中介的。我们先跑跑看”。过了几天,中介公司隔壁的老王来了,老王想出租他自己的电影院。经理跑急忙过来来找小育,“小育给写个出租电影院的程序呗”。小育于是很淡定的添加了一个类CinemaOwner.java.
CinemaOwner.java
public class CinemaOwner { private String name; public CinemaOwner (String name){ this.name = name; } //房屋出租 public void rent(){ System.out.println("租得"+name+"的电影院。"); } } |
Client.java
public class Client { public static void main(String[] args) { CinemaOwner cinemaOwner = new Landlord("老王"); cinemaOwner.rent(); } } |
运行结果:
租得老王的电影院。 |
看到那么容易就实现了,经理说:“貌似代码也没啥问题,看来是老夫多虑了”。
用了处理出租的软件,链表家的生意越来越好有来出租土地(LandOwner)的,热水器(HeaterOwner)的,车辆(VehicleOwner)的,女朋友(GirlFriendOwner)的,猫猫(CatOwner)的,狗狗(DogOwner)的等等。小育应对每一种想出租商品的人,都建立了一个*Owner类。而在链表家出租的商品也超过了10000种,小育创建了10000个类来应对。老板一开心,把脸笑烂了,送到医院抢救去了。老板在救护车上,紧紧的拉着经理和小育的手说,“我们要提升服务质量,以后凡是出租的商品我们要先带客户检查商品,再出租,这样会减少很多客户的投诉”。经理紧紧握住肖老板的手,但心里却走了神,说道“老板您就放心吧,我们会照顾好老板娘的,不是,提高客户满意度的”。老板紧握着的手,松了,顺着嘴角白沫流了出来。经理并没有理会这事情,他意识到了他之前觉得不对劲的代码问题出在哪里了。他苦笑着对小育说:“现在我们在代码里挖的坑要我们自己跳了,你准备肿么办,跳槽还是跳坑?”。小育说:“填了坑在跳槽吧,你都把老板气这样了,我回去加几天班把那10000个*Owner类里都加上检验商品的逻辑就可以了啊”。经理又说:“那明天老板要求凡是美女租东西送小礼品的呢,后天老板又说每一个客户租东西可以积分呢?每一个需求都会导致你10000处的修改。老板那么奇葩,什么要求提说不出口,以后我们的商品不再是10000种,而是1000000种了呢,一个小需求引发1000000处的修改?我们必须找一个简单的方法,对这类提高服务品质的需求,一个需求一处修改。因为我觉得老板应该还是能活到明天的。”
使用代理
小育扶了扶眼镜说道:“我们把租东西,检查待租商品,送美女送礼品这些方法进行分类,哪些是公用方法任何人都可以做的,哪些是只有商品持有者才能做”?经理说:“除了租房,其他方法都不需要商品持有者参与”。小育笑了起来:“这就好办了,那我们把这些公共方法都交给一个代理类Agency来做”。“那私有的方法肿么办,只有*Owner类才正真持有这些商品啊,Agency没办法做啊?”经理还有些疑惑。“这个简单,再让*Owner类和Agency都实现一个Rentable的接口,这样Agency就可以帮*Owner租房子了”。“以后老板任何奇葩的需求,我们都只需要修改Agency的代码就可以实现,在也不用为这破事犯难了”小育解释道。“多说无益,showme the code”,经理说。
Rentable.java
public interface Rentable { public void rent(); } |
HouseOwner.java
public class HouseOwner implements Rentable { private String name; public HouseOwner (String name){ this.name = name; } //房屋出租 public void rent(){ System.out.println("租得"+name+"的房屋。"); } } |
CinemaOwner.java
public class CinemaOwner implements Rentable{ private String name; public CinemaOwner (String name){ this.name = name; } //电影院出租 public void rent(){ System.out.println("租得"+name+"的电影院。"); } } |
Agency.java
public class Agency implements Rentable{ private Rentable renter; @Override public void rent() { System.out.println("中介无微不至的带你检查待租商品。"); //老板的任何奇葩要求只需在这里加一句就轻松搞定 // System.out.println("美女租东西,送小礼品"); renter.rent(); System.out.println("中介高冷的收取了高额中介费。"); } public Rentable getRenter() { return renter; } public void setRenter(Rentable renter) { this.renter = renter; } public Agency(Rentable renter){ this.renter = renter; } } |
Client.java
public class Client { public static void main(String[] args) { Rentable cinemaOwner = new CinemaOwner("老王"); Rentable houseOwner = new HouseOwner("全大哥"); Agency agenty = new Agency(cinemaOwner); agenty.rent(); System.out.println("=========华丽的分割线==============="); agenty.setRenter(houseOwner); agenty.rent(); } } |
输出结果:
中介无微不至的带你检查待租商品。 租得老王的电影院。 中介高冷的收取了高额中介费。 =========华丽的分割线=============== 中介无微不至的带你检查待租商品。 租得全大哥的房屋。 中介高冷的收取了高额中介费。 |
这下经理和小育都送了一口气,今后对于任何公共方法的添加和修改都不用修改那10000个*owner类中做修改了,在Agency类中做一处修改就可以了。小育决定再给他这种设计方式配一张图,看起来就会更加清晰。经理开心的说道:“我们给这个伟大编程的方式取个名字吧,然后再去吃个烧烤庆祝下”。小育说“既然我们是用中介代理的方式分离了公共业务和私有业务,那我们就叫它代理模式吧”。经理说,“这样取名字会不会太过牵强”?小育说:“哪能啊,文章题目不就这么取的吗?”
代理模式
在小育和钟经理的努力下。链表家的生意也越来越红火。通过他们出租的商品从10000种到50000种,而这程序也没出问么大问题。肖老板又一次把脸笑开了花,去医院缝针去了。特地交代一人发2万元奖金,奖励他们对公司的贡献。链表家的故事就这样结束了吗?肖老板内心的狂野,远远没有我们想象的那么温柔。他决定进军其它行业。(未完待续)。
中介公司的故事(一)-Java静态代理相关推荐
- Java 静态代理、Java动态代理、CGLIB动态代理
为什么80%的码农都做不了架构师?>>> Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...
- 【Java静态代理】以模拟“婚庆公司帮助你嫦娥奔月”为例
代码 package cn.hanquan.test;/*静态代理的实现:经常用于记录日志.增强服务* 以此理解多线程new Thread(线程对象).start();的工作原理* 模拟婚庆公司* * ...
- Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了
动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...
- JAVA静态代理和动态代理理解
这篇文章是,是我看到的将代理讲的即深入透彻又浅显易懂.转载自:https://blog.csdn.net/briblue/article/details/73928350 代理 代理是英文 Proxy ...
- JAVA静态代理和动态代理的区别?
代理简述 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 他们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品 ...
- Java静态代理、动态代理与CGLib代理
java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...
- 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!
理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 例如,购买火 ...
- Java静态代理和动态代理
静态代理: 被代理接口: public interface Movie {void play();} 真正的被代理类: public class CaptainAmericaMovie impleme ...
- java静态代理与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...
最新文章
- ubuntu系统php环境变量设置,Ubuntu系统环境变量详解
- Java线程之join
- SQLAlchemy 使用经验
- 【BZOJ 1877】 [SDOI2009]晨跑(费用流)
- ASP.NET使用AJAX应注意IIS有没有.ashx扩展
- jenkins api_接触Jenkins(Hudson)API,第1部分
- lg空调代码大全解决_LG空调故障代码大全
- 【服务器】【个人网盘】宝塔安装OneIndex
- k8s升级从1.13到1.16教程与采坑解决办法
- Windows/Mac上免费好用的压缩软件推荐(持续更新)
- 原版XP SP3安装程序集成识别SATA的AHCI驱动的解决方法
- OneNote笔记备份
- 关于分辨率,你该知道这些!
- Baby Sign Language
- python超清壁纸_Python爬取5K分辨率超清唯美壁纸
- button图片与文字的布局
- SAP那些事-理论篇-15-SAP顾问的三重境界
- 道可道,非常道;名可名,非常名
- 科隆国际游戏展:2000系列显卡来袭,iGame板卡信仰搭配
- python基础 列表
热门文章
- (二)spring security:使用 OAuth2 SSO 实现单点登录
- 互联网根服务器体积位置,【群晖 DS418play 4盘位NAS网络存储服务器使用总结】功耗|构架|盘位|噪音|系统_摘要频道_什么值得买...
- 不可不知的计算机领域的国际组织
- mysqli mysql_PHP使用mysqli操作MySQL数据库的简单方法
- glob匹配多级目录
- 用pageOffice文档控件实现 office文档在线编辑
- SECS/GEM:PLC与MES间处理
- Go 全套学习路线图
- 员工和供应商,撑起了董明珠的手机梦
- webstorm 破解方法