代理模式
# 代理模式 #
----------
什么是代理模式?代理模式在各类开发中运用的相当广泛,不论是j2ee,android还是ios,都能看到它的身影,所以说设计模式无处不在。代理模式,字面理解就是自己不方便做或者不能做的事情,需要第三方代替来做,最终通过第三方来达到自己想要的目的或效果。举例了:员工小李在B总公司打工,B总成天让小李加班不给加班费,小李忍受不住了,就想去法院告B总。虽然法律上允许打官司不请律师,允许自辩。但是小李第一不熟悉法律起诉的具体流程,第二嘴比较笨,人一多腿就抖得厉害。因此,小李决定去找律师帮忙打官司。找律师打官司和自己打官司相比,有相同的地方,也有不同的地方。
相同的地方在于:
1、 都需要提交原告的资料,如姓名、年龄、事情缘由、想达到的目的。
2、 都需要经过法院的取证调查,开庭争辩等过程。
3、 最后拿到审判结果。
不同地方在于:
1、 小李省事了,让专业的人做专业的事,不需要自己再去了解法院那一套繁琐复杂的流程。
2、 把握更大了。
通过上面的例子,我们注意到代理模式有几个重点。
1、 被代理的角色(小李)
2、 代理角色(律师)
3、 协议(不管是代理和被代理谁去做,都需要做的事情,抽象出来就是协议)
下面给个例子:
----------
public class Proxy {
public static void main(String[] args) {
Employer employer=new Employer();
System.out.println("我受不了了,我要打官司告老板");
System.out.println("找律师解决一下吧......");
Protocol lawyerProxy=new LawyerProxy(employer);
lawyerProxy.register("朵朵花开");
lawyerProxy.dosomething();
lawyerProxy.notifys();
}
}
interface Protocol{
//登记资料
public void register(String name);
//调查案情,打官司
public void dosomething();
//官司完成,通知雇主
public void notifys();
}
//律师类
class LawyerProxy implements Protocol{
private Employer employer;
public LawyerProxy(Employer employer){
this.employer=employer;
}
@Override
public void register(String name) {
// TODO Auto-generated method stub
this.employer.register(name);
}
public void collectInfo(){
System.out.println("作为律师,我需要根据雇主提供的资料,整理与调查,给法院写出书面文字,并提供证据。");
}
@Override
public void dosomething() {
// TODO Auto-generated method stub
collectInfo();
this.employer.dosomething();
finish();
}
//律师类特有的方法
public void finish(){
System.out.println("本次官司打完了...............");
}
@Override
public void notifys() {
// TODO Auto-generated method stub
this.employer.notifys();
}
}
//雇主类
class Employer implements Protocol{
String name=null;
@Override
public void register(String name) {
// TODO Auto-generated method stub
this.name=name;
}
@Override
public void dosomething() {
// TODO Auto-generated method stub
System.out.println("我是'"+this.name+"'要告B总,他每天让我不停的加班,还没有加班费。");
}
@Override
public void notifys() {
// TODO Auto-generated method stub
System.out.println("法院裁定,官司赢了,B总需要赔偿10万元精神补偿费。");
}
}
----------
运行后,打印如下:
我受不了了,我要打官司告老板
找律师解决一下吧......
作为律师,我需要根据雇主提供的资料,整理与调查,给法院写出书面文字,并提供证据。
我是'朵朵花开'要告B总,他每天让我不停的加班,还没有加班费。
本次官司打完了...............
法院裁定,官司赢了,B总需要赔偿10万元精神补偿费。
代码说明:
Protocol这个类就是上面所说的协议,是被代理者或者代理者共同遵守的约定。也就是说,无论是原告还是代理律师,到法院走程序,都需要做的事情。我们抽象出来,这个就是协议。
Employer这类是雇主类也称被代理者类,它遵从Protocol协议,并实现了Protocol协议的三个方法,并去分别完成了具体事情。
LawyerProxy这类是代理类,它也遵从Protocol协议,与Employer不同的是,定义了一个Employer对象,通过构造函数初始化。在实现的三个方法里,分别去调用被代理类的相同实现。就好比去模拟一个被告者,站在被告的角度上,去法院告状。也就是说LawyerProxy代理类对所有想打官司的人开放,只要有原告进来,我就帮他打官司。值得注意的是collectInfo和finish这两个函数,请律师打官司和不请律师打官司,其实都要做同样的事情(register、dosomething、notifys),但是至于为什么?刚才不是说了吗,请律师的好处是省心并且专业,他在做同样的事情前提下,还会收集对你有利的证据和资料(collectInfo),以及后续事情的处理(finish)。
上面就是最普通的代理模式,引申一点,我们看到,对于被告来说,必须创建一个Employer类,并实例化后传参给LawyerProxy代理类,这样做,是不是暴漏了Employer?如果隐藏一下,对于被告来说,更智能傻瓜一点,该怎么做呢?
----------
public class Proxy {
public static void main(String[] args) {
//Employer employer=new Employer();
System.out.println("我受不了了,我要打官司告老板");
System.out.println("找律师解决一下吧......");
Protocol lawyerProxy=new LawyerProxy("朵朵花开");
lawyerProxy.dosomething();
lawyerProxy.notifys();
}
}
interface Protocol{
//登记资料
public void register(String name);
//调查案情,打官司
public void dosomething();
//官司完成,通知雇主
public void notifys();
}
//律师类
class LawyerProxy implements Protocol{
private Employer employer;
public LawyerProxy(String name){
if(name==null) {
System.out.println("谁告状?逗我玩呢吧?");
return;
}
if(employer==null) employer=new Employer();
register(name);
}
@Override
public void register(String name) {
// TODO Auto-generated method stub
this.employer.register(name);
}
public void collectInfo(){
System.out.println("作为律师,我需要根据雇主提供的资料,整理与调查,给法院写出书面文字,并提供证据。");
}
@Override
public void dosomething() {
// TODO Auto-generated method stub
collectInfo();
this.employer.dosomething();
finish();
}
public void finish(){
System.out.println("本次官司打完了...............");
}
@Override
public void notifys() {
// TODO Auto-generated method stub
this.employer.notifys();
}
}
//雇主类
class Employer implements Protocol{
String name=null;
@Override
public void register(String name) {
// TODO Auto-generated method stub
this.name=name;
}
@Override
public void dosomething() {
// TODO Auto-generated method stub
System.out.println("我是'"+this.name+"'要告B总,他每天让我不停的加班,还没有加班费。");
}
@Override
public void notifys() {
// TODO Auto-generated method stub
System.out.println("法院裁定,官司赢了,B总需要赔偿10万元精神补偿费。");
}
}
----------
看到没new LawyerProxy("朵朵花开"),只需要给代理类传入简单的名字,隐含了Employer类,代理类就会自动去创建一个Employer实例,模拟一个用户继续替你完成打官司的事情。
篇幅有限,设计模式有很多种,以上列举了常用的几种,也是最常用最基础的几种,希望大家能够理解并掌握,如有兴趣,请参考《设计模式之禅》这本书
----------
评论