学习设计模式 - 代理模式

学习设计模式 - 代理模式

一丶定义

  代理模式为另一个对象提供替身或者占位符以控制对这个对象访问, 被代理的对象可以是远程的对象、创建开销大的对象、需要安全控制的对象

二丶理解

  2.1) 当一个对象除了处理真正的业务逻辑之外, 还需要增加额外的处理,如事务,打印日志等等, 如果将这些额外逻辑放到原对象中,会造成职责不清晰.
          这时可以使用代理对象代理该对象, 代理对象实现额外逻辑, 真正的业务逻辑则委托给被代理对象处理.这样可以使得职责清晰.

 2.2) 为另一个对象提供一个替身或占位符以控制对这个对象的访问.这也是代理模式和装饰者模式之间的重要区别
          当一个对象是大对象或者消耗资源的对象, 为提高系统性能, 可以使用代理对象暂时替代该对象, 到真正需要的时候才生成该对象.
          当权限不够时,可以使用代理对象限制对该对象的访问.

三丶静态代理

  

  a. 主题

public interface Subject {
    void request();
}

  b. 真实主题

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真正业务逻辑...");
    }
}

  c. 代理

public class Proxy implements Subject {

    private Subject subject;

    public Proxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public void request() {
        System.out.println("增加事务...");
        subject.request();
    }
}

  d. 场景类

/**
 * 静态代理
 *
 *  缺点:
 *      相同的代理方法,却要写多个代理类
 * @author TimFruit
 * @date 19-5-25 下午10:15
 */
public class Client {

    public static void main(String[] args) {
        Proxy proxy=new Proxy(new RealSubject());
        proxy.request();

        Proxy2 proxy2=new Proxy2(new RealSubject2());
        proxy2.request();
    }

}

  运行结果为:

增加事务...
真正业务逻辑...
增加事务...
真正的业务处理2...

  还有类似的代码Proxy2没有贴出来, 完整代码可以点此查看

四丶JDK动态代理

  由上面代码可知, 使用静态代理需要为每个"被代理的类", 实现代理类, 当代理类实现方法相同时, 将会产生很多繁琐重复的代码, 因此有了动态代理, 动态代理一般有两种常用的实现, 一种是jdk动态代理, 一种是cglib动态代理. 这里展示的是jdk动态代理.

/**
 * 实现jdk自带的接口
 * 写一个较为通用的"切面"类
 * @author TimFruit
 * @date 19-5-26 上午10:57
 */
public class ProxyInvocationHandler implements InvocationHandler {

    private Object target;

    public ProxyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("增加事务...");
        return method.invoke(target, args);
    }
}

  

  场景类:

/**
 * JDK动态代理
 *  <p>
 *      好处是写一个较为通用的"切面"类就可以了, 动态生成对应的代理类, 减少代码量
 *
 * @author TimFruit
 * @date 19-5-26 上午11:00
 */
public class Client {
    public static void main(String[] args) {

        RealSubject subject=new RealSubject();
        InvocationHandler proxyInvocationHandler=new ProxyInvocationHandler(subject);
        //动态生成代理类
        Subject subjectProxy= (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(), new Class[]{Subject.class}, proxyInvocationHandler);
        subjectProxy.request();

        RealSubject2 subject2=new RealSubject2();
        InvocationHandler proxyInvocationHandler2=new ProxyInvocationHandler(subject2);
        // 动态生成代理类
        Subject2 subjectProxy2= (Subject2) Proxy.newProxyInstance(RealSubject2.class.getClassLoader(), new Class[]{Subject2.class}, proxyInvocationHandler2);
        subjectProxy2.request();
    }
}

  运行结果为:

增加事务...
真正业务逻辑...
增加事务...
真正的业务处理2...

   完整代码点此查看

学习资料:

  <Head First 设计模式>

  <设计模式之禅>

原文地址:https://www.cnblogs.com/timfruit/p/11154804.html

时间: 2024-11-08 20:59:40

学习设计模式 - 代理模式的相关文章

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

一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正的实现是在这里 代理类:同样实现了业务接口,一般都会关联一个实现类的实例,由它来调用实现类 客户端:顾名思义,使用者,与代理类打交道,甚至都不知道具体实现类的存在. 二.代理模式设计图 三.代理模式的简单实现代码 BizInterface.java package com.lipan.designp

设计模式学习--------12.代理模式学习

场景: 福尔摩斯一直想送礼物给花生,但是羞于直接赠送,于是想到让房东太太去帮忙送礼物.编程如何实现呢? 定义: 为其他对象提供一种代理以控制对这个对象的访问. 角色: Proxy:代理对象.有下列功能: 实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. 持有一个具体目标对象的引用,可以在需要时调用具体的目标对象. 可以控制对目标对象的访问,并可以负责创建和删除它. package com.kris.study; public class Proxy implements

设计模式学习之代理模式学习(一)

关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一个程序员的编程思想提升有着很大的帮助.但是设计模式有二十三种,想要全部掌握还是要花点时间的,但如果是只学习常用的几种设计模式还是相对容易的.下面是我学习代理模式的一些心得. 问题引出      什么是代理模式,为什么要用代理模式. 现在有一个场景模拟:有一个tank类,他实现了Moveable接口,Moveable接口中有一个mov

设计模式-代理模式(Go语言描述)

大家好, 我是大帅哥,由于最近又变帅了, 所以我决定由我的代理人小帅哥来写这篇博客,不过内容可以放心,还是由我来完成,小帅哥的活就是将我的内容替我发出来罢了. &_& 还是进入正题吧, 今天这篇博客我们继续来学习设计模式, 在学习了上面几个设计模式之后大家有没有发现设计模式其实很简单, 难道地方是何时选用合适的模式, 这也是设计模式最重要的地方, 不能我们学会的设计模式就可以乱用. 明白就好-- 下面我们就开始介绍一个新的设计模式-代理模式. 模式定义 什么是代码模式? 其实文章刚开始的段

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式——代理模式

概念 代理模式(Proxy),为其他对象提供一种代理以控制对象的访问. 模式结构 一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再 访问真正要访问的对象. 代理模式UML图 代码实战 <span style="font-family:KaiTi_GB2312;font-size:18px;"> //代理模式 class  Proxy : IGiveGift                   //让"代理&qu

23种设计模式----------代理模式(二)

(上一篇)23种设计模式----------代理模式(一) 之前说了基本的代理模式和普通代理模式.接下来开始看下强制代理模式和虚拟代理模式 三,强制代理模式: 一般的代理模式都是通过代理类找到被代理的对象,从而调用被代理类中的方法(即完成被代理类中的任务). 而,强制代理模式则是先找到被代理类自己去完成事情,然后被代理类又将该做的事情转交到代理类中,让代理类来完成. 假如:你有事求助于某位名人. 你告诉名人说有事想请他帮忙,然后他说最近一段时间比较忙,要不你找我的经纪人来办吧. (本来找名人办事

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

23种设计模式----------代理模式(一)

代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者接口) IGamePlayer 2,代理类. 3,被代理类. 下面以游戏玩家代理为例. 一,先来看下最基本的代理模式. 代码如下: 主题接口: 1 package com.yemaozi.proxy.base; 2 3 //游戏玩家主题接口 4 public interface IGamePlaye