小育是国内某省会城市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万元奖金,奖励他们对公司的贡献。链表家的故事就这样结束了吗?肖老板内心的狂野,远远没有我们想象的那么温柔。他决定进军其它行业。(未完待续)。