一 什么是代理模式
关于 设计模式
设计模式是人们在解决软件开发过程中总结出来的智慧结晶。代理模式也是一种解决实际问题的技巧。
在讲概念之前,我们来讲讲明代的首辅制度。因为首辅制度也是一种解决实际问题的技巧。
我们现在来到明朝的嘉靖年间。
假设你是帝国的皇帝,面对着整个大明帝国四千万户,接近两亿的人口。两万多名职业官僚。无数 边防卫戍,治安管理,经济发展,粮食收割,甚至环境保护,都需要你来管理。
要管理好这么多的人,可不是一件容易的差事儿,如果管理不好可能就会出现大问题。
于是,帝国的最高领导人想出了一个好办法,抽象出来了六部的概念,
户部 主管财政。
兵部 主管边防
刑部 主管司法
礼部 主管礼教
吏部 主管人事
工部 主管建设
好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。
然而事情并没有这么美好。因为你发现跟 户部尚书,刑部侍郎 一起交涉的过程依然很痛苦。
每个部门都有其业务特征和处事风格。而且每个充任尚书的人未必能合你的胃口。
每天都要处理无数的琐事。根据史书记载,朱元璋每天要批阅2000本奏章。朱元璋搞得定,但他的后代就扛不住了,逐渐让亲近的大臣等充任大学士,并提升其地位提升了起来,让他们组成了内阁。明朝中后期以后,皇帝有啥事儿,都跟内阁大学士商量。然后再让大学士去管理六部。
好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。
镜头一晃,恭喜你来到了21世纪。现在的你是一个互联网app开发人员,要去独立开发一个Android App,这个app有三十多个功能,二百多个界面。
无数网络获取,数据储存,界面展示,颜色色值。都要你来处理。
要你来自己写,那可就要累死了,不过感谢互联网和开源世界,你想出了一个好办法,抽象出来六个第三方的功能框架
GreenDao 负责数据持久
OKHttp 负责网络数据交互
picasso 负责图片加载
RXJava 负责业务流程设计
margin design 负责界面展示
JCE 负责数据加密
好的,事情完美解决。作为工程师的你,就可以安心写写代码,聊聊妹子。享受人生了。
然而事情并没有这么美好。你发现在使用GreenDao,Picasso的过程中总是会遇到这样那样的问题。第三方框架虽然好用,但是真正使用起来没有那么简单。每个框架都有其学习成本,以及与业务代码不贴切的地方。
于是你抽象出来了大学士这个概念,基于你们公司的移动业务,在六部尚书等第三方框架基础上搭建了属于你自己的业务框架。
好的,事情完美解决。作为皇帝的你,就可以安心回宫,享受人生了。
二 代理模式有什么好处
1 减少工作量,提高工作效率
本来嘉靖皇帝每天要处理200本奏章,1000件国家大事。自从有了内阁大学士们。每天只要看看他们形成的意见(意见)。 发表一下自己的关键意见。 轻松轻松就解决了众多问题
本来你要写三十个功能,200个界面。自动有了业务框架们。每天只要稍稍使用自己的框架,几行代码就可以实现很多高质量的功能。
2 提高可跨拓展性。
在没有大学士之前,如果有一天刑部尚书张大人得了病,告老还乡。 皇帝陛下,很痛苦,需要去考察,去磨合一位新的下属。 再次期间,整个国家的司法必然受到一定程度的影响、
现在有了大学士。可能前脚张大人刚打了个喷嚏,后脚内阁首辅严嵩,和内阁次辅徐阶。 立刻就把他们各自手下的门生推荐上来了。而且还强烈建议为了张大人的人生健康和祖国的司法事业不受影响,应该迅速更换。
在没有代理层之前,如果有一天 piasso突然暴出来出现了一个惊天大Bug。这个app都面临这个无法正常使用,甚至泄露用户信息的风险。 你一定很痛苦,因为你要去做无数的事情,去维护这个app的正常业务.
现在有了ImageSource的业务代理框架。前脚picasso出了大问题,你只需要半天的时间修改为fecso.
你团队里负责开发业务代码的人员,根本不会发现这件事情。对于他们来说ImageSource依然很好用。没有任何改变。
3 贴近业务,提高整体性能。
内阁大学士比第三方框架更贴心,比自己动手实现更有才华,毕竟适合的才是更好的。。
Picasso不会加载空url. 下拉刷新组件会有更符合整体风格的footview和 headview文案以及设计。
网络加载需要,需要延迟,需要重试。界面框架更省电,更省流量、
而这些东西,对于业务框架的使用者来说,完全是天生的。对于app来说无疑大大提升了性能。
三 适用场景
首先是需要一定的复杂度。 管理一个村子是用不到内阁大学士的。甚至连六部尚书都不需要。自己撸起袖子加油干就是了。
第二是 必须有可见的好处。因为代理实际上是要增加一层流程,对效率产生负面影响。
就好像房产中介,他是肯定要从中间抽一层中介费的。
因此具体到使用代理模式的场景,一定要有其意义。
就像房产中介这个代理,如果拿掉其实也不会有太多的差别,反而节省了开支。
最后是一个简单的代理模式实现
package com.dqqdo.testclass;
/**
* Created by qingquan on 2017/6/29.
*/
public class ProxyMain {
public static void main(String args[]){
King king = new King("嘉靖皇帝");
System.out.println("--" + king.getName() + "- 要管理国家事务了。 ----");
Official yansong = new Official("严嵩",false);
Official xujie = new Official("徐阶",true);
System.out.println("-----" + king.getName() + " 选择严嵩作为他的首辅。 ----");
king.setPremier(yansong);
if(king.isWorkDone()){
System.out.println("国家治理的很好,皇帝很开心");
}else{
System.out.println("国家治理的不好,皇帝很生气");
}
System.out.println("-----" + king.getName() + " 选择徐阶作为他的首辅。 ----");
king.setPremier(xujie);
if(king.isWorkDone()){
System.out.println("国家治理的很好,皇帝很开心");
}else{
System.out.println("国家治理的不好,皇帝很生气");
}
}
/**
* 首辅接口
*/
interface Premier{
boolean doWork();
}
/**
* 官员类 实现首辅接口
*/
static class Official implements Premier{
private String name;
private boolean isGoodGuy;
public Official(String name,boolean isGoodGuy){
this.name = name;
this.isGoodGuy = isGoodGuy;
}
@Override
public boolean doWork() {
System.out.println(name + "在做具体的工作");
return isGoodGuy;
}
}
/**
* 皇帝类
*/
static class King{
private Premier premier;
private String name;
public King(String name) {
this.name = name;
}
public Premier getPremier() {
return premier;
}
public void setPremier(Premier premier) {
this.premier = premier;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isWorkDone(){
return premier.doWork();
}
}
}
网友评论