Spring学习-3-代理模式

概述

代理是一种设计模式,它提供了对目标对象另外的访问方式;即通过代理访问目标对象。好处,可以在目标对象实现的基础之上,增强额外的功能操作。(扩展目标对象的功能)

代理对象

目标对象

静态代理

1)代理对象,要实现和目标对象一样的接口

2)保存用户

Dao直接保存

DaoProxy 给保存方法添加事务处理

实例:

staticProxy.UserDao

package staticProxy;

/**
 * Created by cxspace on 16-8-9.
 */
public class UserDao implements IUserDao {
    @Override
    public void save() {
        System.out.println("---保存数据---");
    }
}

staticProxy.IUserDao

package staticProxy;

/**
 * Created by cxspace on 16-8-9.
 */
public interface IUserDao {
    public void save();
}

staticProxy.UserDaoProxy

package staticProxy;

/**
 * Created by cxspace on 16-8-9.
 */
public class UserDaoProxy implements IUserDao {

    private IUserDao target;

    public UserDaoProxy(IUserDao target){
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("--------------------------");
        System.out.println("------保存对象-------------");
        System.out.println("--------------------------");
    }
}

测试

package staticProxy;

import org.junit.Test;

/**
 * Created by cxspace on 16-8-9.
 */
public class App {
    @Test

    public void test(){

        IUserDao target = new UserDao();

        IUserDao proxy = new UserDaoProxy(target);

        proxy.save();

    }
}

总结静态代理

1)  可以做到在不修改目标对象的功能前提下,对目标对象功能扩展

2)  缺点:

因为代理对象需要有目标对象实现一样的接口,所以会出现很多代理类

一旦接口增加方法,目标对象与代理对象都要维护

动态代理

1) 代理对象,不需要实现接口

2) 代理对象的生成,是利用JDKAPI,动态的在内存中构建代理对象(需要我们指定创建代理对象实现的接口的类型)

3) 动态代理,也叫JDK代理或者接口代理

JDK中生成代理对象的api

实例

通用代理类工厂

dynamic.ProxyFactory

package dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by cxspace on 16-8-9.
 *
 * 给所有的dao创建代理对象[动态代理]
 *
 * 代理对象,不需要实现接口
 *
 */
public class ProxyFactory {

    //维护一个
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 给目标对象,生成代理对象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        System.out.println("开启事务");

                        Object returnValue = method.invoke(target,args);

                        System.out.println("提交事务");
                        return returnValue;
                    }
                }
        );
    }
}

测试

package dynamic;

import org.junit.Test;

/**
 * Created by cxspace on 16-8-9.
 */
public class App {

    @Test
    public void testDynamic(){

        IUserDao target = new UserDao();

        //原始类型
        System.out.println(target.getClass());
        //创建代理对象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        //内存中动态生成的代理对象 class com.sun.proxy.$Proxy2

        System.out.println(proxy.getClass());

        proxy.save();
    }
}
时间: 2024-12-16 19:10:42

Spring学习-3-代理模式的相关文章

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

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

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

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

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

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

学习设计模式 - 代理模式

学习设计模式 - 代理模式 一丶定义 代理模式为另一个对象提供替身或者占位符以控制对这个对象访问, 被代理的对象可以是远程的对象.创建开销大的对象.需要安全控制的对象 二丶理解 2.1) 当一个对象除了处理真正的业务逻辑之外, 还需要增加额外的处理,如事务,打印日志等等, 如果将这些额外逻辑放到原对象中,会造成职责不清晰.        这时可以使用代理对象代理该对象, 代理对象实现额外逻辑, 真正的业务逻辑则委托给被代理对象处理.这样可以使得职责清晰. 2.2) 为另一个对象提供一个替身或占位

设计模式学习之--代理模式

代理模式,顾名思义,意思和我们日常生活中的代理差不多,举一个最简单的例子,我们知道,我们的火车站购票有很多的火车票代售点,这个火车票代售点可以代替我们的火车站的售票处让我们买票,当然,代售点相比于火车站售票点又可以提供电话订票和提前预定,这样,火车票代售点就基本可以实现火车站售票点的基本功能,同时还可以提供相对于火车站售票点其他的功能.那么,我们的设计模式中的代理模式就是这个意思. 在我们的程序中,许多类的方法中我们总需要一些额外的共同的功能,比如日志和性能优化操作,如果在所有 这些类中都加入这

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

Spring学习之代理

Spring的核心就是IOC和AOP IOC就是控制反转:   就是用配置文件的方式给javabean 赋值. 正常的在程序里;用new 的方式创建一个对象的时候,他就固定了值, 如果是注入的方式的话可以根据配置文件的配置给他一个值(就变成可改的了).这个好像进一步模式化了程序代码.(个人理解)总有一天可能 一个程序完成所有的应用吧.只要我改配置文件. AOP:面向切面编程:个人理解就是在执行方法的时候做一些事情.让业务更纯净一些,其他的一些必须的功能就切入一段代码完成.如事物. 而AOP的底层

javascript设计模式学习之六——代理模式

一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有很多,诸如防火墙代理,保护代理(帮助过滤掉一些请求,控制不同权限的对象对目标对象的访问),虚拟代理(将一些开销很大的对象,延迟到真正需要的时候才创建),缓存代理等.在javascript中使用较多的是虚拟代理. 二.虚拟代理实现图片预加载 在这个例子中,不使用虚拟代理固然也能够解决问题,不过采用虚拟

设计模式学习之代理模式

代理模式,可以分为两种,一种是静态代理,一种是动态代理. 两种代理从虚拟机加载类的角度来讲,本质上都是一样的,都是在原有类的行为基础上,加入一些多出的行为,甚至完全替换原有的行为.在我们平时写代码的过程中,代理模式可以说是随处可见,所以,本篇博客就将给大家介绍代理模式. 基本概念 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口. UML图 Subject:抽

[oc学习日记]代理模式

何为代理模式,代理模式也成委托模式 代理模式顾名思义,就是一个人让另一个个人帮助他做某事 我们下面就用一个代购的故事为大家讲解代理模式 1.首先我们要创建一个协议,该协议具有具体功能(代购的功能) 1 #import <Foundation/Foundation.h> 2 //声明协议 3 @protocol delegate <NSObject> 4 //协议中代购的方法 5 -(void)buy; 6 @end 2.谁可以实现这个功能,就让这个类去遵循这个协议(在这个例子中,代