小育是国内某省会城市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静态代理相关推荐

  1. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

  2. 【Java静态代理】以模拟“婚庆公司帮助你嫦娥奔月”为例

    代码 package cn.hanquan.test;/*静态代理的实现:经常用于记录日志.增强服务* 以此理解多线程new Thread(线程对象).start();的工作原理* 模拟婚庆公司* * ...

  3. Android开发如何理解Java静态代理 动态代理及动态生成代理对象原理 看这篇就够了

    动态代理与静态代理 前言 代理模式 静态代理 动态代理 JDK代理 动态生成代理对象原理 生成class数据源码 动态代理类真身 总结 前言 近期在研究Hook技术,需要用到动态代理,说到动态代理就会 ...

  4. JAVA静态代理和动态代理理解

    这篇文章是,是我看到的将代理讲的即深入透彻又浅显易懂.转载自:https://blog.csdn.net/briblue/article/details/73928350 代理 代理是英文 Proxy ...

  5. JAVA静态代理和动态代理的区别?

    代理简述 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 他们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品 ...

  6. Java静态代理、动态代理与CGLib代理

    java的动态代理举足轻重,它同反射原理一直是许多框架的底层实现.今天唠一下. 一.代理模式 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标 ...

  7. 面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!

    理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象. 例如,购买火 ...

  8. Java静态代理和动态代理

    静态代理: 被代理接口: public interface Movie {void play();} 真正的被代理类: public class CaptainAmericaMovie impleme ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...

最新文章

  1. ubuntu系统php环境变量设置,Ubuntu系统环境变量详解
  2. Java线程之join
  3. SQLAlchemy 使用经验
  4. 【BZOJ 1877】 [SDOI2009]晨跑(费用流)
  5. ASP.NET使用AJAX应注意IIS有没有.ashx扩展
  6. jenkins api_接触Jenkins(Hudson)API,第1部分
  7. lg空调代码大全解决_LG空调故障代码大全
  8. 【服务器】【个人网盘】宝塔安装OneIndex
  9. k8s升级从1.13到1.16教程与采坑解决办法
  10. Windows/Mac上免费好用的压缩软件推荐(持续更新)
  11. 原版XP SP3安装程序集成识别SATA的AHCI驱动的解决方法
  12. OneNote笔记备份
  13. 关于分辨率,你该知道这些!
  14. Baby Sign Language
  15. python超清壁纸_Python爬取5K分辨率超清唯美壁纸
  16. button图片与文字的布局
  17. SAP那些事-理论篇-15-SAP顾问的三重境界
  18. 道可道,非常道;名可名,非常名
  19. 科隆国际游戏展:2000系列显卡来袭,iGame板卡信仰搭配
  20. python基础 列表

热门文章

  1. (二)spring security:使用 OAuth2 SSO 实现单点登录
  2. 互联网根服务器体积位置,【群晖 DS418play 4盘位NAS网络存储服务器使用总结】功耗|构架|盘位|噪音|系统_摘要频道_什么值得买...
  3. 不可不知的计算机领域的国际组织
  4. mysqli mysql_PHP使用mysqli操作MySQL数据库的简单方法
  5. glob匹配多级目录
  6. 用pageOffice文档控件实现 office文档在线编辑
  7. SECS/GEM:PLC与MES间处理
  8. Go 全套学习路线图
  9. 员工和供应商,撑起了董明珠的手机梦
  10. webstorm 破解方法