java類增強方式
阿新 • • 發佈:2019-04-06
華麗 sta 測試類 target ati tex ext 使用 bsp
我理解的增強類即是對類進行功能性擴展,除了網上常規的3種方法(
1、繼承或者實現接口:特點是被增強對象不能變,增強的內容不能變。
2、裝飾著模式:特點是被增強對象可變,但增強內容不可變。
3、動態代理:特點是被增強對象可變,增強內容可變。
)外,還應該包括如下幾種方式:組合(根據設計模式思想組合應該優先於繼承考慮)、內部類
組合:自身需增強類持有目標類對象
內部類:目標需增強類內部添加新類型,該新類型可以有繼承或者實現行為
1 package com.test; 2 3 /** 4 * 自身需增強類 5 * 6 * @author 7 * @date 2019/4/68 */ 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類增強方式