1. 程式人生 > >java類增強方式

java類增強方式

華麗 sta 測試類 target ati tex ext 使用 bsp

我理解的增強類即是對類進行功能性擴展,除了網上常規的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("\n----------------華麗的分割線----------------\n");
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類增強方式