我理解的增强类即是对类进行功能性扩展,除了网上常规的3种方法(
1、继承或者实现接口:特点是被增强对象不能变,增强的内容不能变。
2、装饰着模式:特点是被增强对象可变,但增强内容不可变。
3、动态代理:特点是被增强对象可变,增强内容可变。
)外,还应该包括如下几种方式:组合(根据设计模式思想组合应该优先于继承考虑)、内部类
组合:自身需增强类持有目标类对象
内部类:目标需增强类内部添加新类型,该新类型可以有继承或者实现行为
package com.test; /** * 自身需增强类 * * @author * @date 2019/4/6 */ public class Extension { private Target target;//方式一:持有目标类对象 public Extension(Target target) { this.target=target; } public Extension() { } public void action(){ System.out.println("com.test.Extension.action"); } public void action1(){ target.before(); action(); target.after(); } class Target1 extends Target{ //方式二:以内部类继承或者实现目标类 public void action2(){ before(); action();//内部类可以访问外部类所有成员 after(); } @Override public void after() { //为了进一步扩大展示效果,改写目标类方法,也可使用原目标类方法 System.out.println("com.test.Extension.Target1.after"); } @Override public void before() { System.out.println("com.test.Extension.Target1.before"); } } }
package com.test;
/**
* 目标类
*
* @author
* @date 2019/4/6
*/
public class Target {
public void before(){
System.out.println("com.test.Target.before");
}
public void after(){
System.out.println("com.test.Target.after");
}
}
package com.test;
/**
* 测试类
* @author
* @date 2019/4/6
*/
public class TestExtension {
public static void main(String[] args) {
Target target=new Target();
Extension extension = new Extension(target);
System.out.println("----------------增强前");
extension.action();
System.out.println("----------------增强后");
extension.action1();
System.out.println("\n----------------华丽的分割线----------------\n");
Extension.Target1 target1 = extension.new Target1();
System.out.println("----------------增强前");
extension.action();
System.out.println("----------------增强后");
target1.action2();
}
}
运行结果:
----------------增强前
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
总结:对类进行增强,本质上是在原有基础上添加新功能,无论是添加新引用,或者新内部类,都可以看做是通过添加新成员以达到扩展本类的目的。
最后:可能组合的模式和相应的设计模式有异曲同工的地方,但添加新成员以达到扩展任然不失为一种解决思路。仁者见仁智者见智,以技术交流为目的,有问题的地方欢迎大家交流指正。