Java设计模式菜鸟系列(十四)代理模式建模与实现

时间:2022-09-22 15:55:10

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

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

一、静态代理

1、uml建模:

Java设计模式菜鸟系列(十四)代理模式建模与实现

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建模:

Java设计模式菜鸟系列(十四)代理模式建模与实现

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. 使用github远程仓库

    经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...

  2. BZOJ SCOI2005骑士精神

    裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...

  3. &lbrack;Winform&rsqb;一个简单的账户管理工具

    最近一直觉得注册的账户越来越多,帐号密码神马的容易弄混.自己就折腾了一个简单的账户管理工具,其实实现也挺简单,将每个账户的密码及相关密码提示信息,经aes算法加密之后保存到数据库,当前登录用户可以查询 ...

  4. 方法:查询MongoDB数据库中最新一条数据&lpar;JAVA&rpar;

    使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...

  5. MyEclipse 8&period;5配置Tomcat7&period;0

    MyEclipse 8.5配置默认没有Tomcat7.0, 如果想使用怎么办.? window>>Preferences>>MyEclipse Enterprise Workb ...

  6. 搭架私有Git服务器Gogs

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:搭架私有Git服务器Gogs.

  7. 【codeforce 219D】 Choosing Capital for Treeland (树形DP)

    Choosing Capital for Treeland Description The country Treeland consists of n cities, some pairs of t ...

  8. java Byte&period;toString 方法与String&period;ValueOf&lpar;Byte&rpar;效率比较

    int times = 10000000; Byte[] li = new Byte[times]; for (int i = 0; i < times; i++) { li[i] = (byt ...

  9. webpack 3&period;X学习之基本配置

    创建配置文件webpack.config.js 在根目录在手动创建webpack.config.js,配置基本模板 module.exports ={ entry:{}, output:{}, mod ...

  10. dbconfig&period;properties

    jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/数据库名 jdbc.username=root jdbc. ...