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

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

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. 201521123117 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结: 1.通过equals方法以及l ...

  2. 201521123086《java程序设计》第7周

    本章学习总结 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public boolean con ...

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

    1.本周学习总结 用百度脑图画了一张,点开图片全屏就可以看清楚了 脑图链接 2.书面作业 Q1.代码阅读 以下代码可否编译通过?哪里会出错?为什么?尝试改正? 如果创建3个Test1对象,有内存中有几 ...

  4. 201521123017 《Java程序设计》第11周学习总结

    1. 本周学习总结 2. 书面作业 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步 ...

  5. 201521123042 《Java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 上周总结了异常,这周主要总结多线程. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题 ...

  6. Java :构造器中的显式参数和this隐式参数

    1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...

  7. Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  8. linux系统命令<二>----du的使用方法

    1> 要显示一个目录树及其每个子树的磁盘使用情况 du /home/linux 这在/home/linux目录及其每个子目录中显示了磁盘块数. 2> 要通过以1024字节为单位显示一个目录 ...

  9. temp--达州银行

    达州银行现场 服务器IP地址 192.168.1.234 ilink / ilink 自己电脑需要设置为固定IP 192.168.1.XXX 子网掩码 255.255.255.0 192.168.1. ...

  10. session get和load方法对比

    get测试代码如下: public class Test { public static void main(String[] args) { // TODO Auto-generated metho ...