java类增强方式
我理解的增强类即是对类进行功能性扩展,除了网上常规的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
总结:对类进行增强,本质上是在原有基础上添加新功能,无论是添加新引用,或者新内部类,都可以看做是通过添加新成员以达到扩展本类的目的。
最后:可能组合的模式和相应的设计模式有异曲同工的地方,但添加新成员以达到扩展任然不失为一种解决思路。仁者见仁智者见智,以技术交流为目的,有问题的地方欢迎大家交流指正。
java类增强方式的更多相关文章
- 使用java类的方式配置spring 需要什么注解?
1.@Configuration 修饰类,声明当前类是一个配置类,相当于applicationContext.xml文件 2.@ComponentScan 用于指定spring在初始化容器时要扫描的包 ...
- 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据
12.4 基于Java类定义Bean配置元数据 12.4.1 概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...
- [Java]类的生命周期(下)类的初始化[转]
上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...
- [Java]类的生命周期(上)类的加载和连接[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...
- Spring中,使用Java配置的方式进行依赖注入
之前用spring的时候,只知道使用xml的方式,和使用注解的方式,却一直不知道在spring中,还可以使用Java类的方式进行配置.使用Java类的方式,就可以取代xml和注解.使用Java配置是S ...
- JVM-类加载过程(Java类的生命周期)
什么是类加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的 ...
- Java类载入器 ClassLoader的解析
//參考 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类载入器基本概念 类载入器是 Java 语言的一个创新,也是 Ja ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- Spring使用注解开发及使用java类进行配置bean
Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...
随机推荐
- spring AOP 编程--AspectJ注解方式 (4)
1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...
- c# Data = select new{} 返回值的显示
- (function($){….})(jQuery)与$(function(){})的区别
function fun($){…};fun(jQuery);这种方法多用于存放开发的插件,执行其中的代码时,Dom对象并不一定加载完毕. $(function(){})等价于$(document). ...
- Minifilter 相关
FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO 商用软件一定要过滤掉这个类型的请求,这个类型的请求响应非常慢. FLTFL_OPERATION_REGISTRA ...
- 一次bug死磕经历之Hbase堆内存小导致regionserver频繁挂掉
环境如下: Centos6.5 Apache Hadoop2.7.1 Apache Hbase0.98.12 Apache Zookeeper3.4.6 JDK1.7 Ant1.9.5 Maven3. ...
- Ubuntu环境下安装Scala以及安装IntelliJ Scala插件(Plugin)
一.Scala介绍 1.结合Spark处理大数据 这是Scala的一个主要应用,而且Spark也是那Scala写的. 2.Java的脚本语言版 可以直接写Scala的脚本,也可以在.sh直接使用Sc ...
- [转]MEF学习
MEF学习 :http://www.cnblogs.com/comsokey/p/MEF1.html C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记( ...
- memcache课程---3、php使用memcache缓存实例
memcache课程---3.php使用memcache缓存实例 一.总结 一句话总结: 前置:windows下安装好memcache.exe,安装好memcache的php扩展,开启memcache ...
- html 按钮跳转问题(及其相关)
1.点击一个按钮跳转到另一个页面 (网址) 两种写法: <button onclick="{location.href='location.html'}">获取现在 ...
- JEECMS 自定义标签
CMS 是”Content Management System” 的缩写,意为” 内容管理系统”. 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场.对于内容管理,业界还没有一个统 ...