今天学习了一下代理模式,代理模式分为很多种。目前感觉有两种是需要学习一下的。

  • 静态代理模式
  • 动态代理模式

1. 静态代理模式

  需要被代理的类,实现一个或者多个接口。

  代理类需要实现被代理类的接口,在此时就可以对这个接口中的方法进行一些操作。

  还是直接上代码吧。

IPerson接口类。

public interface IPerson { public void buyHouse(); }

Man类,实现buyHouse方法。

 public class Man implements IPerson {
@Override
public void buyHouse() {
System.out.println("准备买房了,然而钱并不够");
}
}

PersonProxy类,实现IPerson接口,同时在不修改man对象中的方法的情况下,对man的buyHouse方法进行了修饰。

 import java.nio.channels.NonWritableChannelException;

 public class PersonProxy implements IPerson {
private Man man; public void setMan(Man man) {
this.man = man;
} @Override
public void buyHouse() {
if(null == man){
man = new Man();
}
man.buyHouse();
watch();
speak();
} private void speak(){
System.out.println("代理砍价=======一顿吆喝");
} private void watch(){
System.out.println("-----带着看房--------");
}
}

测试类。

 public class MainClass {
public static void main(String[] args) {
PersonProxy personProxy = new PersonProxy();
personProxy.buyHouse();
}
}

2. 动态代理模式

动态代理模式,不同于静态代理模式的地方,是不用去实现被代理类的接口,降低了修改接口后的维护代价,Java中JDK有相关的接口实现。

具体代码如下。

IPerson接口类和Man类保留。

MyHander类,对代理这件事进行了操作。核心就是method.invoke方法。

 package com.whitetaken.test;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class MyHandler implements InvocationHandler {
private Man man; public void setMan(Man man) {
this.man = man;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if(null == man){
man = new Man();
}
result = method.invoke(man, args);
speak();
watch();
return result;
} private void speak(){
System.out.println("代理砍价=======一顿吆喝");
} private void watch(){
System.out.println("-----带着看房--------");
}
}

测试类。

 package com.whitetaken.test;

 import java.lang.reflect.Proxy;

 public class MainClass {
public static void main(String[] args) {
Man man = new Man();
MyHandler myHandler = new MyHandler();
myHandler.setMan(man);
IPerson person = (IPerson)Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), myHandler);
person.buyHouse();
}
}

以上两种模式的测试结果一致。

每天一点小进步,聚沙成塔-_-!!!

(@WhiteTaken)设计模式学习——代理模式的更多相关文章

  1. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

  2. 设计模式学习——代理模式(Proxy Pattern)之 强制代理(强校验,防绕过)

    上周温习了代理模式:http://www.cnblogs.com/chinxi/p/7354779.html 在此进行拓展,学习强制代理.但是发现网上大多例子都有个“天坑”(我是这么认为的),在得到代 ...

  3. 设计模式学习——代理模式(Proxy Pattern)

    放假啦~学生们要买车票回家了,有汽车票.火车票,等.但是,车站很远,又要考试,怎么办呢?找代理买啊,虽然要多花点钱,但是,说不定在搞活动,有折扣呢~ /// /// @file Selling_Tic ...

  4. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  5. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  6. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  7. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  8. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  9. 设计模式之代理模式之二(Proxy)

    from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy)   0.前言 在前 ...

随机推荐

  1. 【Alpha】第一次项目冲刺

    今日站立式会议照片 每个人的工作 小组成员 昨天完成的工作 今天计划完成的工作 李志霖 继续访问用户以深入了解他们的需求,分别采用面访,qq等不同方式对意见进行了采集,面访了30个人,qq空间以链接的 ...

  2. 201521123019 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 (1)代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  3. 201521123010 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常: ①题目5-1 1.1 截图你的提交结果(出现学号) A: 1.2 ...

  4. 201521123026 《java程序设计》 第九周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) PTA提交结果: 运行结果截图: 1.2 ...

  5. smarty文件夹,第一个smarty实例总结

    主要是libs里面的smarty类,和init.inc.php配置文件   剩下的是php文件夹.模板文件夹,临时文件夹.缓存文件夹.配置文件夹.插件文件夹   调用main文件夹中的php文件,通过 ...

  6. angular 时间戳转换

    .filter('getWeek', function() { return function(input) { var date = new Date(input * 1000); var week ...

  7. Python学习笔记013_正则表达式

    Python中的正则表达式是通过 re 模块实现的. 通配符 .  表示除了换行以外的任何字符; 编写正则表达式时使用  r're'  , r + 正则表达式内容 >>> impor ...

  8. MX4拍摄视频转码方法

    问题 使用魅族4手机拍摄的视频,其视频编码是H.265 目前大多数设备不支持解码,表现为常用播放器无法正常播放视频,剪辑软件无法剪辑视频. 解决方案 使用软件进行转码,期间尝试软件如下: 爱剪辑 部分 ...

  9. PHP中isset和empty的区别(最后总结)

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  10. React Router 按需加载+服务器渲染的闪屏问题

    伴随着React协议的『妥协』(v16采用MIT),React为项目的主体,这个在短期内是不会改变的了,在平时使用过程中发现了如下这个问题: 在服务器渲染的时候,刷新页面会出现闪屏的现象(白屏一闪而过 ...