java类增强方式
Posted swz1104919
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java类增强方式相关的知识,希望对你有一定的参考价值。
我理解的增强类即是对类进行功能性扩展,除了网上常规的3种方法(
1、继承或者实现接口:特点是被增强对象不能变,增强的内容不能变。
2、装饰着模式:特点是被增强对象可变,但增强内容不可变。
3、动态代理:特点是被增强对象可变,增强内容可变。
)外,还应该包括如下几种方式:组合(根据设计模式思想组合应该优先于继承考虑)、内部类
组合:自身需增强类持有目标类对象
内部类:目标需增强类内部添加新类型,该新类型可以有继承或者实现行为
1 package com.test; 2 3 /** 4 * 自身需增强类 5 * 6 * @author 7 * @date 2019/4/6 8 */ 9 public class Extension { 10 private Target target;//方式一:持有目标类对象 11 public Extension(Target target) { 12 this.target=target; 13 } 14 15 public Extension() { 16 } 17 18 public void action(){ 19 System.out.println("com.test.Extension.action"); 20 } 21 22 public void action1(){ 23 target.before(); 24 action(); 25 target.after(); 26 } 27 28 29 class Target1 extends Target{ //方式二:以内部类继承或者实现目标类 30 31 public void action2(){ 32 before(); 33 action();//内部类可以访问外部类所有成员 34 after(); 35 } 36 37 @Override 38 public void after() { //为了进一步扩大展示效果,改写目标类方法,也可使用原目标类方法 39 System.out.println("com.test.Extension.Target1.after"); 40 } 41 42 @Override 43 public void before() { 44 System.out.println("com.test.Extension.Target1.before"); 45 } 46 } 47 48 }
1 package com.test; 2 3 /** 4 * 目标类 5 * 6 * @author 7 * @date 2019/4/6 8 */ 9 public class Target { 10 public void before(){ 11 System.out.println("com.test.Target.before"); 12 } 13 14 public void after(){ 15 System.out.println("com.test.Target.after"); 16 } 17 }
1 package com.test; 2 3 /** 4 * 测试类 5 * @author 6 * @date 2019/4/6 7 */ 8 public class TestExtension { 9 public static void main(String[] args) { 10 Target target=new Target(); 11 Extension extension = new Extension(target); 12 System.out.println("----------------增强前"); 13 extension.action(); 14 15 System.out.println("----------------增强后"); 16 extension.action1(); 17 18 System.out.println(" ----------------华丽的分割线---------------- "); 19 20 Extension.Target1 target1 = extension.new Target1(); 21 System.out.println("----------------增强前"); 22 extension.action(); 23 24 System.out.println("----------------增强后"); 25 target1.action2(); 26 } 27 }
运行结果:
----------------增强前
com.test.Extension.action
----------------增强后
com.test.Target.before
com.test.Extension.action
com.test.Target.after
----------------华丽的分割线----------------
----------------增强前
com.test.Extension.action
----------------增强后
com.test.Extension.Target1.before
com.test.Extension.action
com.test.Extension.Target1.after
总结:对类进行增强,本质上是在原有基础上添加新功能,无论是添加新引用,或者新内部类,都可以看做是通过添加新成员以达到扩展本类的目的。
最后:可能组合的模式和相应的设计模式有异曲同工的地方,但添加新成员以达到扩展任然不失为一种解决思路。仁者见仁智者见智,以技术交流为目的,有问题的地方欢迎大家交流指正。
以上是关于java类增强方式的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch代码片段,及工具类SearchEsUtil.java