http://blog.csdn.net/jackiehff/article/details/8621517
这篇文章举例很是恰当,对于理解代理模式很有帮助。例子是,老板要开会,但是呢,开会之前的工作比如通知到会人员,布置场地以及开会后的收尾工作,这些都可以交给秘书来做,此时,老板是被代理对象,老板把布置场地、通知到会人员的权限分给秘书,秘书去做,那么老板就可以专注于会议内容。
就像我理解的架构师和程序员,或者程序员和ssh框架的关系一样,被代理对象只要专注于重要的部分,其他部分就让代理去代(替)(打)理
实现方法:和装饰模式类似,一个接口(开会),两个实现了这个接口的类,一个叫被代理对象(老板),一个叫代理对象(秘书),初始化秘书对象时要把老板对象的引用传给秘书对象的成员变量。
老板类里面实现他的工作(meeting()),秘书对象里面有一个接口引用(用来指向老板对象),秘书对象的meeting方法里,先完成通知到会人员等操作,再调用成员变量(老板)的meeting方法,再完成会议收尾工作
脑洞:上面的例子,秘书可以调用老板的任何方法。呵呵,程序员写了调用就调用,不写调用就不调用,就酱。
二者区别:功能上,装饰模式完成的是功能的追加,比如在新增用户功能上增加保存是谁增加的哪个用户,这里的追加可以追加很多,追加的功能互不干扰和知晓,追加的时候,只要把所有的可追加的子类功能写好,就在被装饰对象在调用待追加功能的方法之前,调用待追加子类的装饰方法setter方法将成员变量像俄罗斯套娃一样一个一个套上,最后再调用最后套上的那个对象的默认同名方法即可。
代理模式初衷应该是功能的分解,老板把开会功能分成会前准备、正式开会、会后收尾,把除了正式开会的工作都交给秘书(代理)去操作,自己做正式开会功能。但是形式上,代理模式和装饰模式都是给一个方法追加一些代码,形式上的区别在于追加的代码在哪的不同,代理模式的代码都在一个方法里面,要修改只能修改这个方法,要新增也只能在这个方法里新增,而装饰模式追加的代码在新的类里面,改可以在新的类里面修改,新增可以重新写一个子类,调用的使用用子类对象装饰一下即可