我们在学习 Spring 时会先学习代理模式:包括静态代理与动态代理。
在学习静态代理模式时,总感觉与装饰者模式特别像,有时候会特别迷茫,自己写的到底是代理模式还是装饰者模式。那么代理模式与装饰者模式的本质区别是什么呢?
我也看过很多大牛写的关于两者的区别,意思是说到了,但是总感觉写得太多专业,不太好理解。
那么如何更简单的理解两者的区别呢?其实非常简单,从使用者的角度来理解,是最简单的。
如下代码:代理模式
public class Client { public static void main(String[] args) { /** * 使用者只与代理类交互,根本不知道代理类调用IUserService 哪个实现类 * * 这种就是代理模式 * */ IUserService userService = new UserServiceProxy(); userService.addUser(); } }
装饰者模式:
public class Client { public static void main(String[] args) { /** * 使用者自己创建IUserSerivce的实现类,然后将创建的对象,交由装饰器进行装饰,即是进行功能加强 * * 这种就是装饰者模式。 */ IUserService userServiceImpl = new UserServiceImpl(); IUserService userService = new UserServiceDecorator(userServiceImpl); userService.addUser(); /** * 使用者只与代理类交互,根本不知道代理类调用IUserService 哪个实现类 * * 这种就是代理模式 * */ //IUserService userService = new UserServiceProxy(); //userService.addUser(); } }
通过使用者可以看出:
代理模式:使用者根本不用关心实现类是谁。
装饰者模式:使用者需要自己创建实现类对象,然后转给装饰器进行功能加强。
看似是两个小小的区别,在现实生活中,可以很容易找到原型。
(1)我们租房子时,我们只要去房屋中介说我要租房子。根本不用关心房东是谁,如何找到房东,中介会帮我们搞定。所以代理模式的本质就是使用者根本不用关心具体的实现类。
(2)装饰者模式,比如我们买了一套房子,我们要装修,我们去装修公司说,我的这套房子(具体的对象)要装修,那么装修公司就会以你传入的对象(你的房子)作为基础来进行装修。
其实我们再看看代理模式与装饰者模式的代码,主能看出,其实写法差异并不大。
(1)创建一个 IUserService 接口,暂时只有一个方法,添加用户 addUser()
/** * 客户服务接口 * * @author hasee * */ public interface IUserService { public void addUser(); }
(2) 具体的实现类 UserServiceImpl
public class UserServiceImpl implements IUserService { @Override public void addUser() { System.out.println("UserService 添加用户!"); } }
(3) 创建代理类,主要是代理类同样也实现 IUserService 接口,并创建一个具体对象的引用,
并在构造方法中自己创建具体实现类对象。
public class UserServiceProxy implements IUserService { private IUserService userService; public UserServiceProxy() { this.userService = new UserServiceImpl(); } public void addUser() { this.userService.addUser(); log("成功添加一条客户数据!"); } public void log(String content) { System.out.println("添加日志:" + content); } }
(4)创建装饰者类,同样实现IUserService ,只是实现类需要使用者传入。
public class UserServiceDecorator implements IUserService { private IUserService userService; public UserServiceDecorator(IUserService userService) { this.userService = userService; } @Override public void addUser() { this.userService.addUser(); log("成功添加一条客户数据!"); } public void log(String content) { System.out.println("添加日志:" + content); } }
相关推荐
NULL 博文链接:https://871656094.iteye.com/blog/2355335
Java 代理模式: 详见:http://blog.csdn.net/q610098308/article/details/74144046
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
设计模式--装饰者模式java例子
JAVA静态代理和动态代理
java设计模式之装饰者模式代码
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型...一旦你熟悉了装饰者的技巧,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。——《Head First 设计模式》
Java 静态代理
Java 代理 - Java 代理 - 代理模式 - 静态代理与动态代理 - 常见的动态代理实现 ...这个故事是最典型的代理模式,代购从供应商购买货物后返回给调用者,也就是需要代理的小明。 代理可以分为静态代理和
这里提供了静态代理和动态代理的入门写法~一看即懂!
静态代理、装饰者、动态代理1. 静态代理设计模式1.1 ...代理模式是Java常见的设计模式之一。 代理模式是指不直接调用实际对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?
设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
Java静态代理和动态代理
java中的装饰模式及动态代理模式示例源码,并且手写数据库连接池,以及展示动态代理模式在连接池中的使用
java观察者模式观察者模式java观察者模式观察者模式java观察者模式观察者模式
JAVA设计模式之装饰模式代码
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java代理模式模板代码,包含动态代理与静态代理。 静态代理使用了传统的代理类来代理,动态代理中使用了jdk的反射原理进行代理