zoukankan      html  css  js  c++  java
  • 代理设计模式

    代理模式:
            代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象来控制对原对象的引用;
    所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
            
    
    
    
    在代理模式中的角色:
      ●  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
      ●  目标对象角色:定义了代理对象所代表的目标对象。
      ●  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
    源代码
    
      抽象对象角色
    public abstractclass AbstractObject {
        //操作public abstract void operation();
    }
      目标对象角色
    
    public class RealObject extends AbstractObject {
        @Override
        public void operation() {
            //一些操作
            System.out.println("一些操作");
        }
    }
    
      代理对象角色
    
    public class ProxyObject extends AbstractObject{
        RealObject realObject = new RealObject();
        @Override
        public void operation() {
            //调用目标对象之前可以做相关操作
            System.out.println("before");        
            realObject.operation();        
            //调用目标对象之后可以做相关操作
            System.out.println("after");
        }
    }
      客户端
    
    public class Client {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            AbstractObject obj = new ProxyObject();
            obj.operation();
        }
    
    }
      从上面的例子可以看出代理对象将客户端的调用委派给目标对象,在调用目标对象的方法之前跟之后都可以执行特定的操作。
    
    
    
    
    比较生动鲜活的例子:
    1,什么是代理模式?
    代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
    2,策略模式有什么好处?
        在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
    3,代理模式一般涉及到的角色有:
    抽象角色:声明真实对象和代理对象的共同接口; 
    代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时           刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 
    真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
    4,应用场景举例:
    比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时是这样的体现的
    先说说这个场景中的要素:一种类型的女人,潘金莲,王婆,西门庆,后来扩展的贾氏也和西门庆勾上了,我们是假设的,然后西门庆找潘金莲happy,但潘金莲不好意思直接,就找个王婆代理呗。我们看看具体代码。
     
    先定义一种女人
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *定义一种类型的女人,王婆和潘金莲都属于这个类型的女人 
     */  
    public interface KindWoman {  
        //这种女人能做什么事情呢?  
        public void makeEyesWithMan();//抛媚眼  
        public void happyWithMan();//和男人那个....  
    }  
     
    一种类型嘛,那肯定是接口,定义个潘金莲
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *定义一个潘金莲是什么样的人 
     */  
    public class PanJinLian  implements KindWoman{  
        @Override  
        public void happyWithMan() {  
            System.out.println("潘金莲和男人在做那个...");  
        }  
        @Override  
        public void makeEyesWithMan() {  
            System.out.println("潘金莲抛媚眼...");  
        }  
    }  
     
    再定义个丑陋的王婆
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *王婆这个人老聪明了,她太老了,是个男人都看不上她, 
     *但是她有智慧经验呀,他作为一类女人的代理! 
     */  
    public class WangPo implements KindWoman {  
        private KindWoman kindWoman;  
        public WangPo(){  
            //默认的话是潘金莲的代理  
            this.kindWoman = new PanJinLian();  
        }  
        //她可以是KindWomam的任何一个女人的代理,只要你是这一类型  
        public WangPo(KindWoman kindWoman){  
            this.kindWoman = kindWoman;  
        }  
        @Override  
        public void happyWithMan() {  
            //自己老了,干不了了,但可以叫年轻的代替。  
            this.kindWoman.happyWithMan();  
        }  
        @Override  
        public void makeEyesWithMan() {  
            //王婆年纪大了,谁看她抛媚眼啊  
            this.kindWoman.makeEyesWithMan();  
        }  
      
    }  
     
    两个女主角都上场了,该男主角了,定义个西门庆
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *  
     *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下: 
     *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很! 
     */  
    public class XiMenQiang {  
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            WangPo wangPo;  
            //把王婆叫出来  
             wangPo = new WangPo();  
            //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:  
            wangPo.makeEyesWithMan();  
            //看到没有表面是王婆在做,其实爽的是潘金莲  
            wangPo.happyWithMan();  
        }  
      
    }  
     
    那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去了王婆这个中间环节,直接西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
         那我们再考虑一下,水浒里面还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个管家苟合的那个),这个名字起的:“贾氏”,那我们也让王婆做她的代理:
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *定义一个贾氏是什么样的人 
     */  
    public class JiaShi implements KindWoman {  
      
        @Override  
        public void happyWithMan() {  
            System.out.println("贾氏和男人在做那个...");  
        }  
        @Override  
        public void makeEyesWithMan() {  
            System.out.println("贾氏抛媚眼...");  
        }  
    }  
     
    西门庆勾潘金莲又勾引贾氏
    Java代码  
    package com.yangguangfu.proxy;  
    /** 
     *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下: 
     *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很! 
     */  
    public class XiMenQiang {  
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            WangPo wangPo;  
            //把王婆叫出来  
             wangPo = new WangPo();  
            //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:  
            wangPo.makeEyesWithMan();  
            //看到没有表面是王婆在做,其实爽的是潘金莲  
            wangPo.happyWithMan();  
              
            //西门庆勾引贾氏  
            JiaShi jiaShi = new JiaShi();  
            wangPo = new WangPo(jiaShi);  
            wangPo.makeEyesWithMan();  
            wangPo.happyWithMan();  
        }  
    }  
     说完这个故事,那我总结一下,代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口呗。好了不多说了,慢慢体会吧。
    
    
    参考文献:http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
                   http://yangguangfu.iteye.com/blog/815787
    业勤于精荒于嬉 http://www.cnblogs.com/maxlei/
  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/maxlei/p/5954148.html
Copyright © 2011-2022 走看看