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类增强方式的主要内容,如果未能解决你的问题,请参考以下文章

对java方法进行功能增强的三种方法

增强一个Java类中的某个方法的几种方式

elasticsearch代码片段,及工具类SearchEsUtil.java

java 装饰者类

如何从 Android Studio 中片段的 XML 布局导航到相应的 java 类?

java 设计模式 之 装饰器模式