转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435

代理模式(Proxy):代理模式事实上就是多一个代理类出来,替原对象进行一些操作。比方咱有的时候打官司须要请律师,由于律师在法律方面有专长,能够替咱进行操作表达咱的想法,这就是代理的意思。代理模式分为两类:1、静态代理(不使用jdk里面的方法);2、动态代理(使用jdk里面的InvocationHandler和Proxy)。以下请看演示样例:

一、静态代理

1、uml建模:

2、代码实现

/**
* 演示样例(一):代理模式 --静态代理(没有调用JDK里面的方法)
*
* 目标接口
*/ interface Targetable {
public void targetMethod();
} class Target implements Targetable { @Override
public void targetMethod() {
System.out.println("this is a target method...");
}
} class Proxy implements Targetable {
private Target target; public Proxy() {
this.target = new Target();
} private void beforeMethod() {
System.out.println("this is a method before proxy...");
} private void afterMethod() {
System.out.println("this is a method after proxy...");
} /**
* 在运行目标方法前后加了逻辑
*/
@Override
public void targetMethod() {
beforeMethod();
target.targetMethod();
afterMethod();
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 创建代理对象
*/
Targetable proxy = new Proxy();
/**
* 运行代理方法
*/
proxy.targetMethod();
}
}

二、动态代理

1、uml建模:

2、代码实现

/**
* 演示样例(二):代理模式 --动态代理
*
* 以加入用户为例
*/
class User {
private String username;
private String password; public User() {
} public User(String username, String password) {
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
} /**
* 目标接口
*/
interface IUserDao {
public void add(User user);
} class UserDaoImpl implements IUserDao {
@Override
public void add(User user) {
System.out.println("add a user successfully...");
}
} /**
* 日志类 --> 待织入的Log类
*/
class LogEmbed implements InvocationHandler {
private IUserDao target; /**
* 对target进行封装
*/
public IUserDao getTarget() {
return target;
} public void setTarget(IUserDao target) {
this.target = target;
} private void beforeMethod() {
System.out.println("add start...");
} private void afterMethod() {
System.out.println("add end...");
} /**
* 这里用到了反射
*
* proxy 代理对象
*
* method 目标方法
*
* args 目标方法里面參数列表
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod();
// 回调目标对象的方法
method.invoke(target, args);
System.out.println("LogEmbed --invoke-> method = " + method.getName());
afterMethod();
return null;
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
IUserDao userDao = new UserDaoImpl();
LogEmbed log = new LogEmbed();
log.setTarget(userDao);
/**
* 依据实现的接口产生代理
*/
IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao
.getClass().getClassLoader(), userDao.getClass()
.getInterfaces(), log);
/**
* 注意:这里在调用IUserDao接口里的add方法时,
* 代理对象会帮我们调用实现了InvocationHandler接口的LogEmbed类的invoke方法。
*
* 这样做,是不是有点像Spring里面的拦截器呢?
*/
userDaoProxy.add(new User("张三", "123"));
}
}

三、总结

代理模式优点:1、一个代理类调用原有的方法,且对产生的结果进行控制。2、能够将功能划分的更加清晰,有助于后期维护。

Java设计模式菜鸟系列(十四)代理模式建模与实现的更多相关文章

  1. Java设计模式菜鸟系列(十五)建造者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...

  2. Java设计模式菜鸟系列(十)模板方法模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39806973 模板方法模式(Template Method):在一个方法中定义了一个算法的 ...

  3. java设计模式(一)动态代理模式,JDK与CGLIB分析

    -本想着这个知识点放到Spring Aop说说可能更合适一点,但因为上一篇有所提到就简单分析下,不足之处请多多评论留言,相互学习,有所提高才是关键! 什么是代理模式: 记得有本24种设计模式的书讲到代 ...

  4. Java设计模式菜鸟系列(一)策略模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天開始咱们来谈谈Java设计模式. 这里会结合uml图形来解说,有对uml ...

  5. 菜鸟版JAVA设计模式—从买房子看代理模式

    今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比較好理解,取代去做就是代理. 比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去 ...

  6. 【java设计模式】(3)---代理模式(案例解析)

    设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...

  7. java设计模式(10):代理模式(Proxy)

    一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...

  8. Java设计模式菜鸟系列(两)建模与观察者模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一 ...

  9. Java设计模式(八)Proxy代理模式

    一.场景描述 代理在生活中并不少见,租房子需要找中介,打官司需要找律师,很多事情我们需要找专业人士代理我们做,另一方面,中介和律师也代理了房东.法律程序与我们打交道. 当然,设计模式中的代理与广义的代 ...

随机推荐

  1. hdu1394(线段树求逆序对)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 线段树功能:update:单点增减 query:区间求和 分析:如果是0到n-1的排列,那么如果 ...

  2. [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9613   Accepted: 2 ...

  3. Cordova CLI源码分析(二)——package.json

    每个包需要在其顶层目录下包含一个package.json文件,该文件不仅是包的说明,也影响npm安装包时的配置选项 更多参数详见参考文档https://npmjs.org/doc/json.html ...

  4. Good Luck Charlie(听力恢复训练)

    系统的音标学习完毕后.在暑假进入了稍大强度的听力恢复训练.材料选择的是一部家庭情景喜剧片<Good Luck Charlie>,该剧是2010开播的.剧中运用到的大量词汇是和如今比較贴合的 ...

  5. Linux------创建和终止进程

    创建进程: Linux创建两个步骤的新处理:fork()和exec().其中fork创建当前进程的能力(父进程)副本,那个孩子.父子进程只有PID不同.在这之后,该系统具有两个进程,运行相同的操作.父 ...

  6. C#实现仿QQ震动

    前提:新建winForm窗体应用程序,放置一个Button,设置按钮的单击事件 ; i < ; i++) { Point p = this.FindForm().Location; ,p.Y+) ...

  7. MYSQL高可用(HA)随想

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  8. (九)通过几段代码,理清angularJS中的$injector、$rootScope和$scope的概念和关联关系

    $injector.$rootScope和$scope是angularJS框架中比較重要的东西,理清它们之间的关系,对我们兴许学习和理解angularJS框架都很实用. 1.$injector事实上是 ...

  9. 用数组array代替CActiveRecord构建CArrayDataProvider

    当需要构建 GridView的时候: 常常用 CArrayDataProvider 或者 CActiveDataProvider 这是就需要一个CActiveRecord 比如:  857       ...

  10. net MVC 的八个扩展点

    net MVC 的八个扩展点 MVC模型以低耦合.可重用.可维护性高等众多优点已逐渐代替了WebForm模型.能够灵活使用MVC提供的扩展点可以达到事半功倍的效果,另一方面Asp.net MVC优秀的 ...