(@WhiteTaken)设计模式学习——代理模式
今天学习了一下代理模式,代理模式分为很多种。目前感觉有两种是需要学习一下的。
- 静态代理模式
- 动态代理模式
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)设计模式学习——代理模式的更多相关文章
- swift设计模式学习 - 代理模式
移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...
- 设计模式学习——代理模式(Proxy Pattern)之 强制代理(强校验,防绕过)
上周温习了代理模式:http://www.cnblogs.com/chinxi/p/7354779.html 在此进行拓展,学习强制代理.但是发现网上大多例子都有个“天坑”(我是这么认为的),在得到代 ...
- 设计模式学习——代理模式(Proxy Pattern)
放假啦~学生们要买车票回家了,有汽车票.火车票,等.但是,车站很远,又要考试,怎么办呢?找代理买啊,虽然要多花点钱,但是,说不定在搞活动,有折扣呢~ /// /// @file Selling_Tic ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- 设计模式学习--复合模式(Compound Pattern)
设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- 设计模式之代理模式之二(Proxy)
from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy) 0.前言 在前 ...
随机推荐
- 团队作业8----第二次项目冲刺(Beta阶段) 第七天
BETA阶段冲刺第六天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 完成查重部分 (2) 今天计划完成的工作 (3) 工作中遇到的困难: 尤少辉:在测试的时候发现了,文件名保存到数据 ...
- spring在扫描包中的注解类时出现Failed to read candidate component错误
出现:org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate componen ...
- 201521123119《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1.常用异常 题目5-1 Q1.1 截图你的提交结果(出现学号) Q1.2 ...
- python基础之socket
一.osi七层 完整的计算机系统由硬件,操作系统,软件组成. 互联网的核心就是由一堆协议组成,协议就是标准,如全世界通信的标准就是英语. 如果把计算机比作人,那么互联网协议就是计算机界的英语,所有计算 ...
- GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列升讯威微信营销系统开发实践:(1)功能设计与架构设 ...
- spring mvc 经常出现的错误
spring mvc 经常出现的错误 spring3.0 和jdk 1.8不是很兼容.有时候会出现一些错误 建议使用spring 4.0和jdk1.8搭配使用 书籍 spring mvc 学习指南上面 ...
- 逆向实战干货,快速定位自动捡阳光Call,或者标志
逆向实战干货,快速定位自动捡阳光Call,或者标志 注意: 关于CE和OD的使用,这里不再多说,快速定位,默认大家已经有了CE基础,或者OD基础. 第一种方法,找Call 第一步,打开CE,搜索阳光值 ...
- go-fasthttp源码分析
1.架构 listener->server->workerpool 1.1.workerpool中有两种缓存: a.wp.ready,缓存未退出worker, b.worker退出后用sy ...
- 11 Linear Models for Classification
一.二元分类的线性模型 线性分类.线性回归.逻辑回归 可视化这三个线性模型的代价函数 SQR.SCE的值都是大于等于0/1的 理论分析上界 将回归应用于分类 线性回归后的参数值常用于pla/pa/lo ...
- mac pycharm 里table键设置为4个空格键
Operation flow: File--Default Settings editor--code style--python