`

代理模式

 
阅读更多

 生活中的代理:

       每个歌星都有自己的代理人, 歌星有自己的事业:唱歌。

         每次开演唱会, 前期要 宣传,广告,手续,等等。。。  完会又要  结账,收钱,给会场方交手续费,交税等等。。

         如果歌星没有代理,每次开演唱会  管这些 繁琐的手续 就会让他累死。。。

 

java 中的代理:

       有接口  : 具体要做的事 (歌唱)

       有实现类 : 做事的不同的实现 (要唱哪些歌)

       有代理 : 处理 执行接口方法时 额外的流程 (宣传,广告,手续,结账,交税...)

 

 

代理模式形成条件
    1.有多个实现类实现了一个接口中的某个方法

     2.在调研实现类的方法 之前 之后 还有一些必须的事情要做
    

    代理类 亦是该接口的实现类,但代理类 不直接 实现接口中的方法,而是调用原有实现类进行实现

    代理类,作为接口的代理, 在执行接口中方法的实现时 调用具体接口的实现类

 

 


    例子:
   
  

    public interface Sing
    {
        public void singing();
    }

    public class Singer implements Sing
    {

       // 实现歌唱的方法
        public void singing()
        {
            // 具体唱什么歌 略...
        }

    }

    public class SingerAgent implements Sing    {

        private Object singerObj; // 被代理的对象

        public SingerAgent(Object obj) // 通过构造方法传入 被代理 的对象,也可以通过 set 方法
        {
            this.singerObj = obj;
        }

        public void singing()
        {
            System.out.println("开演唱会前     宣传,安排会场......");
            agentObject.sayHello();  // 执行具体实现类的方法
            System.out.println("开演唱会后     结账,交税......");
        }

    }

    public class Test()
    {

        public static void main(String []  args)
        {
            // 直接调用实现类的方法
            Sing singer1 = new Singer();
            singer1.singing();

            // 使用代理调用实现类的方法,在这种场景下我们可以在
            // 代理类的方法中 显示 的控制是否执行在执行具体实现的 前后 执行其它事情...
            Human human2 = new ManAgent ( new Man() );
            human2.sayHello();
        }

    }
 

   
    从上面我们可以看出来,代理就是在接口实现类方法执行之前让代理来做一部分操作。
    就是将这个方法的主动权交给了代理,由代理来决定什么时候执行它,执行前后有什么操作等等。
   
    上面的例子是一个静态代理的例子,我们知道了接口方法的具体定义,也知道具体的实现类。
    当我们只知道接口方法定义而不知道是哪个具体的实现类时怎么来代理呢?将具体的实现类作为
    一个参数传递给 代理,代理不管是哪个实现类,只要是接口的实现类就执行相应的方法即可。
   
    JDK 为我们提供了一个很好的类来实现动态代理的模式。
    InvocationHandler(Interface) 和 Proxy 类。
   
    Proxy 负责创建动态代理对象
    动态代理对象要实现 InvocationHandler
   
   

    public class DynamicAgent implements InvocationHandler
    {

        private Object agentObject ; // 代理对象,作为参数传入,可用构造传也可以用 set 方法

        public DynamicAgent(Object obj)
        {
            this.agentObject = obj;
        }

        public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable
        {
            System.out.println("执行方法之前...");

            method.invoke(agentObj, args);   // 方法中使用 代理对象 反射调用 方法
            return null;
        }

    }

    public DynamicAgentTest
    {

        public static void main(String[] args)
        {
            // 获取接口代理对象 ,根据传入对象的不同生成不同对象的代理
            Sing singger = agentObjFactory( getMan() );
            singger.singing();
        }

        /**
         * 将代理的对象传入方法,生成改接口实例对象的代理
         * 具体的实现类可以是很多个
         */
        private static Object agentObjFactory(Object obj)
        {
            // 通过 proxy 构建一个代理对象,被代理的对象 obj 作为方法的参数传入
            Sing agentObj = (Sing) Proxy.newProxyInstance(obj.getClass()
                .getClassLoader(), obj.getClass().getInterfaces(),
                new Agent1Handler(obj));
        }

        /**
         * 改方法返回一个真实的需要被代理的对象,可以是一个工厂方法。
         */
        private static Object getMan()
        {
            return new Singer(); // 可以返回不同的接口的实现类对象
            //return new Singer1 
           // return new Singer2 ...  多种唱歌的实现



        }

    }
 

   
   
    使用代理模式有什么好处?
    这样想,当我们有一个接口叫登陆,那么对于登陆有六个实现类(六种不同的登陆方法)。
    在每次登陆之前,我们要考虑是否满足登陆的条件。满足条件再做登陆操作。
   
    在传统的代码中,每个实现类都要考虑是否满足登陆条件。造成代码冗余,代码逻辑与结构不够清晰
   
  

    public interface Login
    {
        void log();
    }

    public class CheckLog
    {
        public static boolean check(){ ... }
    }   

    public class loger1 implements Login
    {

        public void log()
        {
            if ( CheckLog.check() )
            {
                // log1... 具体实现
            }
        }

    }   
  
    public class loger2 implements Login
    {

        public void log()
        {
            if ( CheckLog.check() )
            {
                // log2... 具体实现
            }
        }

    }
 

   
    这样一来每个实现类都要考虑是否满足条件。
   
    使用代理时,每个实现类不用管那么多,只管做自己如何实现登陆这个动作就行了。
   
   

    public interface Login
    {
        void log();
    }
   
    public class loger1 implements Login
    {
        public void log()
        {
                // log1... 具体实现
        }
    }   
   
    public class loger2 implements Login
    {

        public void log()
        {
                // log2... 具体实现
        }

    }

    public class logAgent implements InvacationHandler
    {

        private Object agentObj; // 代理的对象       

        public logAgent(Object obj)
        {
            this.agentObj = obj;
        }       

        public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable
        {
            if ( checkLog() )  // 是否满足登陆条件的判断
            {
                method.invoke(agentObj, args);   // 执行具体的登陆
            }
            return null;
        }

    }
 

   
    这样一来,实现类所要做的就是单一实现 登陆。在登陆过程中需要考虑的 流程
    交给代理来完成。
   

分享到:
评论

相关推荐

    代理模式的使用示例程序

    代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代接口,以控制对原始对象的访问。这种模式的主要目的是为了增加灵活性、安全性或者在不修改原有对象的情况下,增强或扩展其...

    JAVA设计模式之代理模式实例

    代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和...

    设计模式之代理模式Proxy

    代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...

    Android设计模式之代理模式(Proxy Pattern)

    代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...

    android使用signalr代理模式和非代理模式

    SignalR提供了两种主要的工作模式:代理模式和非代理模式。这两种模式在实现上有所不同,各自具有优缺点,适用于不同的场景。 **1. 代理模式(Proxy Mode)** 在代理模式下,SignalR为每个Hub(服务端的业务逻辑...

    设计模式-代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...

    java中的三种代理模式

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    代理模式小例子

    代理模式是一种设计模式,它在软件工程中扮演着重要的角色,允许我们为其他对象提供一个替代接口,以控制对原对象的访问。这种模式的主要目的是为了增加灵活性、安全性或者为对象提供额外的功能,同时保持客户端代码...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    结构型模式之代理模式(Proxy)

    代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们将深入探讨代理模式的概念、实现方式以及它在实际开发中的应用。 代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象控制对原对象的访问。在...

    android设计模式之代理模式

    代理模式在软件设计中是一种常用的设计模式,尤其在Android开发中,它可以帮助我们实现复杂的控制逻辑,隔离复杂性,以及提供额外的功能。在Android上下文中,代理模式常常用于数据加载、权限控制、事件处理等方面。...

    设计模式C++学习之代理模式(Proxy)

    代理模式是一种设计模式,它是结构型模式之一,主要用于在客户端和目标对象之间建立一个代理对象,以便控制对目标对象的访问。在C++中,代理模式可以用来为其他对象提供一种代理以控制对这个对象的访问,或者增加...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    设计模式--代理模式

    代理模式是一种常用的设计模式,它在软件开发中扮演着重要角色,允许我们通过一个代理类来控制对原对象的访问。在《设计模式:可复用面向对象软件的基础》(通常称为GoF设计模式)中,代理模式被定义为“为其他对象...

    代理模式 C++实现

    代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...

    cas代理模式代码示例

    在IT行业中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或控制访问。在本示例中,我们将重点讨论如何在Java环境下使用代理模式来实现代理逻辑,特别是在CAS(Central ...

Global site tag (gtag.js) - Google Analytics