定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    理解:代理模式就是将对象的能力委托给其他对象进行访问和执行,同时其他对象也拥有对象的相同能力。
    这个设计模式,可以运用于集成redis、monggo等相关组件时,将存和取数据定义成“缓存”类型的两个功能,再定义“代理缓存”来代理“redis缓存”,这样往后扩展或者更换成其他缓存方法时,可直接修改“代理缓存”对象代理的对象,而不需要去修改业务代码;

    场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
    第一步,先定义一种类型的女人:

    1. public interface KindWomen {
    2. public void makeEyesWithMan();
    3. public void happyWithMan();
    4. }

    第二步,定一个潘金莲:

    1. public class PanJinLian implements KindWomen {
    2. @Override
    3. public void makeEyesWithMan() {
    4. System.out.println("潘金莲抛媚眼");
    5. }
    6. @Override
    7. public void happyWithMan() {
    8. System.out.println("潘金莲正在happy中......");
    9. }
    10. }

    第三步,再定一个丑陋的王婆:

    1. public class WangPo implements KindWomen {
    2. private KindWomen kindWomen;
    3. public WangPo() {
    4. this.kindWomen = new PanJinLian();
    5. }
    6. public WangPo(KindWomen kindWomen) {
    7. this.kindWomen = kindWomen;
    8. }
    9. @Override
    10. public void makeEyesWithMan() {
    11. this.kindWomen.makeEyesWithMan();
    12. }
    13. @Override
    14. public void happyWithMan() {
    15. this.kindWomen.happyWithMan();
    16. }
    17. }

    第四步,定义西门庆通过王婆勾搭潘金莲:

    1. public class XiMenQing {
    2. public static void main(String[] args) {
    3. WangPo wangPo = new WangPo();
    4. wangPo.makeEyesWithMan();
    5. wangPo.happyWithMan();
    6. }
    7. }

    第五步扩展,西门庆也可以通过代理人王婆勾搭其他女人:
    比如定义贾氏:

    1. public class JiaShi implements KindWomen {
    2. @Override
    3. public void makeEyesWithMan() {
    4. System.out.println("贾氏抛媚眼");
    5. }
    6. @Override
    7. public void happyWithMan() {
    8. System.out.println("贾氏正在happy中......");
    9. }
    10. }

    西门庆勾搭贾氏:

    1. public class XiMenQing2 {
    2. public static void main(String[] args) {
    3. JiaShi jiaShi = new JiaShi();
    4. WangPo wangPo = new WangPo(jiaSh);
    5. wangPo.makeEyesWithMan();
    6. wangPo.happyWithMan();
    7. }
    8. }