装饰者模式与动态代理 柔光的暖阳◎ 2022-05-14 02:24 156阅读 0赞 类的方法的增强的方式有很多,最初使用的继承,但继承的缺点是后期项目会产生很多的类,增加了项目的复杂度,于是,人们提出了组合,这点在Go语言设计最突出,Go语言甚至去掉了类的继承,在java的设计模式的,类的增强的设计模式常见有装饰者模式和动态代理,本文阐述装饰者模式和动态代理模式的设计技巧. ## 装饰者模式 ## 装饰者模式可以实现对一个类的方法的前后增强,为了更好的阐述该模式的原理,我从一个Service层的添加用户的方法addUser()展开 首先写一个接口UserService,中有一个addUser()方法 public interface UserService { void addUser(); } 实现UserService public class UserServiceImp implements UserService { @Override public void addUser() { System.out.println("add user ........"); } } 写一个装饰类,前置增强addUser() 方法,指定其构造方法,使得在创建类的时候,传入UserService,并保存在属性中,在重写的方法中调用 public class UserServiceBeforeDecorate implements UserService { private UserService userService; public UserServiceBeforeDecorate(UserService userService){ this.userService=userService; } @Override public void addUser() { //前置增强 System.out.println("before decorate.........."); userService.addUser(); } } 写一个UserService的后置增强方法,与上面类似 public class UserServiceAfterDecorate implements UserService { private UserService userService; public UserServiceAfterDecorate(UserService userService){ this.userService=userService; } @Override public void addUser() { userService.addUser(); //后置增强 System.out.println("after decorate .........."); } } 写一个测试类 @Test public void test3(){ UserServiceBeforeDecorate decorate = new UserServiceBeforeDecorate(new UserServiceAfterDecorate(new UserServiceImp())); decorate.addUser(); } 这种写法是不是很熟悉,在java的IO中,就是这样设计的 // IO的使用 try { BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("lhc.txt"))); } catch (FileNotFoundException e) { e.printStackTrace(); } 但也可以看到,在java的IO的API中,出现了众多的小类,增加了IO的复杂度,这也是装饰者模式中不可避免的缺点 ## 动态代理 ## 增强类的方法的另一种方式是使用动态代理,Spring框架的AOP也是基于此,我同样从一个Service层的添加用户的方法addUser()展开,看如何前后置增强 使用动态代理,需要写一个类实现InvocationHandler ,同样,指定其构造方法,在创建类的时候注入UserService ,并保存到属性中,值得关注的是重写的invoke的方法参数含义 其中method指的是被代理的对象的方法,args指的是被代理的对象的方法的参数,故使用反射执行该方法,并添加前后置增强 public class UserServiceInvocationHandler implements InvocationHandler { private UserService userService; public UserServiceInvocationHandler(UserService userService){ this.userService=userService; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //对UserService的每一方法的前后置增强 System.out.println("addUser before........."); Object invoke = method.invoke(userService, args); System.out.println("addUser after........."); return invoke; } } 写一个测试,使用Prox的newProxyInstance方法,创建代理对象,需要传入三个参数 第一个:实现类的类加载器 第二个: 实现类所实现的所有接口 第三个就是上面写的实现InvocationHandler 的类 @Test public void test6(){ UserService userServiceImp = new UserServiceImp(); UserService userService = (UserService)Proxy.newProxyInstance(userServiceImp.getClass().getClassLoader(), userServiceImp.getClass().getInterfaces(), new UserServiceInvocationHandler(userServiceImp)); userService.addUser(); } 调用器addUser方法,可看到控制台输出方法的前后置增强 addUser before......... add user ........ addUser after.........
相关 装饰者模式 package C\_Decker; /\\ \ 设计原则:类应该对扩展开放,对修改关闭。 \ 装饰者模式:动态地将责任和行为附加到对象上。若要扩展功能,装饰者提供了 骑猪看日落/ 2022年07月12日 12:17/ 0 赞/ 195 阅读
相关 装饰者模式 1.定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。使用Decorator模式相比用 快来打我*/ 2022年06月05日 06:14/ 0 赞/ 180 阅读
相关 装饰者模式 作用:可以给一个对象添加职责,可以用来扩展,比继承更有弹性。 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上 蔚落/ 2022年05月25日 07:49/ 0 赞/ 172 阅读
相关 装饰者模式 装饰者模式有一个设计非常巧妙的结构,可以为对象动态添加功能。在基本的设计原则中,有一个重要的原则叫做合成/聚合复用原则。根据该原则的思想,代码复用应该尽可能使用委托,而不是继承 红太狼/ 2022年05月14日 02:50/ 0 赞/ 200 阅读
相关 装饰者模式与动态代理 类的方法的增强的方式有很多,最初使用的继承,但继承的缺点是后期项目会产生很多的类,增加了项目的复杂度,于是,人们提出了组合,这点在Go语言设计最突出,Go语言甚至去掉了类的继承 柔光的暖阳◎/ 2022年05月14日 02:24/ 0 赞/ 157 阅读
相关 装饰者模式 装饰者模式: 动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的代替方案 继承和组合的区别: 继承: 我就是我/ 2022年05月11日 14:12/ 0 赞/ 216 阅读
相关 静态代理与装饰模式 静态代理与装饰模式 一、静态代理 1. 代理模式是指,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理 曾经终败给现在/ 2022年04月18日 03:09/ 0 赞/ 183 阅读
相关 装饰者模式 TB - top bottom(自上而下) BT - bottom top(自下而上) RL - right left(从右到左) LR - left 亦凉/ 2022年02月18日 11:23/ 0 赞/ 204 阅读
相关 装饰者模式 装饰者模式,在不改变一个对象本身功能的基础上给对象增加额外的新行为。比如,我们到书店买书,在不改变书籍本身的基础上,赠送个书签,或者要个包装袋 装饰者模式(Decora 谁践踏了优雅/ 2021年12月03日 15:25/ 0 赞/ 342 阅读
相关 装饰者模式 一 点睛 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算 悠悠/ 2021年07月24日 19:11/ 0 赞/ 376 阅读
还没有评论,来说两句吧...