1. 代理模式的作用

  将主要业务与次要业务进行松耦合组装。

2. 代理模式的本质

  监控行为特征

3. 案例

  (1)喝果粒果汁

    主要业务:喝果汁

    次要业务:喝前摇一摇

  (2)JDK代理模式实现

    接口:定义所有需要被监听行为

    接口实现类:农夫果粒,果粒橙

    通知类:实现次要业务,当前被拦截的主要业务与次要业务如何绑定执行

    代理对象

  示例:

  (1)创建接口

/*
*
* 只有需要被监控的行为才有资格
* 在这里声明
*
*/
public interface DrinkService {
public void drink();
}

 (2)接口实现类

public class Huiyuan implements DrinkService {
@Override
public void drink() {
System.out.println("喝汇源果汁");
}
}
public class Guolicheng implements DrinkService {
@Override
public void drink() {
System.out.println("喝果粒橙");
}
}

 (3)通知类

public class GuozhiInvocationHandler implements InvocationHandler {

    private DrinkService target;

    public GuozhiInvocationHandler(DrinkService target){
this.target = target;
} // invoke方法:在被监控行为将要执行时,会被JVM拦截,被监控行为和行为实现方会被作为参数输送invoke
// 这个被拦截方法是如何与当前次要业务方法绑定实现
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null; if("drink".equals(method.getName())){
yaoyiyao();
returnValue = method.invoke(target,args);
} return returnValue;
} private void yaoyiyao(){
System.out.println("喝前摇一摇");
}
}

  (4)代理类

public class ProxyFactory {

    public static DrinkService builder(Class clazz) throws IllegalAccessException, InstantiationException {

        //1.创建被监控实例对象
DrinkService target = (DrinkService) clazz.newInstance();
//2.创建一个通知对象
InvocationHandler adviser = new GuozhiInvocationHandler(target);
//3.向JVM申请负责监控target对象指定行为的监控对象(代理对象)
/*
* loader:被监控对象隶属的类文件在内存中真实地址
* interfaces:被监控对象隶属的类文件实现接口
* h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助
*/
DrinkService $proxy = (DrinkService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),adviser);
return $proxy;
}
}

测试类:

public class TestDemo {
public static void main(String[] args) throws InstantiationException, IllegalAccessException { DrinkService huiyuan = ProxyFactory.builder(Huiyuan.class);
huiyuan.drink();
DrinkService guolicheng = ProxyFactory.builder(Guolicheng.class);
guolicheng.drink();
}
}

测试结果:

喝前摇一摇
喝汇源果汁
喝前摇一摇
喝果粒橙

spring得到所有Action类的更多相关文章

  1. 第五课 Struts的控制器【续】Action类的execute()方法

    1.Action类的execute()方法: public ActionForward execute(ActionMapping mapping,                           ...

  2. fielderror里的fieldName代表的是jsp里的fieldName还是Action类的成员变量?(待解答)

    1.值栈的Action对象中会有一个fielderror属性,代表着字段错误. fielderror是Map<String,List<String>>类型 例如下面的值栈里可看 ...

  3. Struts2中的Action类(解耦方式,耦合方式)

    一.解耦方式 特点:对web资源进行了封装,便于单元测试. 实现:ActionContext和接口方式 1.ActionContext 特点:Action执行的上下文对象.保存了执行Action所需要 ...

  4. Action类中获取request等对象的方法

    struts2中的action类中,SevletActionContext可以获取

  5. Action类为何要继承ActionSupport

    Action类为何要继承ActionSupport   理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.open ...

  6. Action类为何要 extends ActionSupport

    我做的时候,我的action是继承ActionSupport的 Struts 2的Action无须实现任何接口或继承任何类型,普通的POJO类就可以用做Action类,但是,我们为了方便实现Actio ...

  7. Spring 的优秀工具类盘点

    文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等.我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来 ...

  8. 实现Action类

    实现Action类 1.Action类的作用: (1)封装HTTP的请求参数: (2)处理用户请求: (3)封装处理结果. 2.Action类是什么,在Action类中应该包含什么: Action类就 ...

  9. 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类

    Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功 ...

随机推荐

  1. B/S和C/S结构的区别

    概念: C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境 ...

  2. .NET设计模式 第二部分 创建型模式(1)—:单件模式(Singleton Pattern)

    单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...

  3. Linux下Python与C++混合编程

    最近在做一个CUDA的项目,记录下学习心得. 系统 Linux --generic #-Ubuntu x86_64 GNU/Linux C++调用Python Python模块代码: #!/usr/b ...

  4. 手动增加pe节并修改oep

    一直想学学怎么动动pe文件,学习了几篇文章尤其是寒晨的文章后,自己动手也尝试了一下加节和修改oep,写出来供和我一样菜的一起进步. 一.       增加pe节需要的操作 1.    确定内存中的节的 ...

  5. linux zip删除指定文件和追加文件

    使用zip命令的-d参数即可删除zip包中的特定文件. 示例:假设有test.zip,包含_code(目录)._code.zip.readme.txt三个文件,现在要删除test.zip中的_code ...

  6. C++用 _findfirst 和 _findnext 查找文件

    一.这两个函数均在io.h里面.   二.首先了解一下一个文件结构体: struct _finddata_t {     unsigned    attrib;     time_t      tim ...

  7. php解析url并得到url中的参数及获取url参数

    <?php $url = 'http://www.baidu.com/index.php?m=content&c=index&a=lists&catid=6&ar ...

  8. MySQL 快速构造一亿条记录的表

    在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:http://blog.csdn.net/mchdba/article/details/52938114,但是因为录入一亿表需要2 ...

  9. python条件判断,真假

    整形 非0即真 字符串 非空即真 列表,元组,字典,集合为空时 为假 函数 返回值为空(即函数中只写了return后面没参数),为0(即return 0),为空的列表,字典,集合.那么条件判断函数也是 ...

  10. Docker容器技术的PaaS云平台架构设计***

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...