我们来看看这个问题:在已经实现的功能上如何再添加其他功能?如在一个类中有一个addUser方法,我们如何再实现这个逻辑之前加上其他逻辑!

实例代码:

//空的接口类
public interface Father {//nothing
}//需要添加逻辑的源代码
public class UnChangeableClass implements Father {public  void addUser(){//在下面代码之前添加其他逻辑System.out.println("add user success");}
}

方法一: (硬编码实现)我们可以在这个类中直接添加其他代码:比如我们可以这样写

缺点:是需要改变已有代码,不灵活,代码量大

public class UnChangeableClass implementsFather {public  void addUser(){otherFunction();//添加其他逻辑

          System.out.println("add user success");}public void otherFunction(){System.out.println("add other functions");}}

方法二:(继承实现 is - a)我们可以再写一个类,让这个类继承上面的类,然后实现添加逻辑的功能, 在这个时候spring的配置就得改变为这个类

缺点:我们用了继承的方式,程序的耦合度提高,而且基本上每个有这样需求的类都得加一个新类,不灵活

public class Helper extends UnChangeableClass{@Overridepublic  void addUser(){//添加其他方法otherFunction();//调用父类的方法super.addUser();}public void otherFunction(){System.out.println("add other functions");}
}

方法三:(组合实现 has a)我么重新写一个类,继承自该类的接口,让后组合这两个类--------其实这是一种java的静态代理

public class Helper2 implements Father {// 将委托类组合到代理类(通过构造方法)private UnChangeableClass target = null;public Helper2(UnChangeableClass target) {this.target = target;// TODO Auto-generated constructor stub}public void otherFunction() {// 添加的逻辑System.out.println("Other funciton ");// 委托类的逻辑target.addUser();}}

测试方法

public class Test {public static void main(String [] args){//委托类对象UnChangeableClass target=new UnChangeableClass();//代理类对象Helper2 proxy =new Helper2(target);//执行代理类方法(实际是在代理类中组合了委托类了代理类添加的方法)proxy.otherFunction();}}

转载于:https://www.cnblogs.com/fjsnail/p/3495807.html

如何实现在已有代码之后添加逻辑之继承,组合(静态代理)实现方法相关推荐

  1. 提高代码质量——使用Jest和Sinon给已有的代码添加单元测试

    概述 在日常的功能开发中,我们的代码测试都依赖于自己或者QA进行测试.这些操作不仅费时费力,而且还依赖开发者自身的驱动.在开发一些第三方依赖的库时,我们也没有办法给第三方提供完整的代码质量报告. 现在 ...

  2. c# mysql代码中写事务_代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性...

    [c#]代码库代码中使用事务前提:务必保证一个功能(或用例)在同一个打开的数据连接上,放到同一个事务里面操作. 首先是在D层添加一个类为了保存当前操作的这一个连接放到一个事务中执行,并事务执行打开同一 ...

  3. Resx 文件无效。未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List`1请确保已在项目中添加了必需的引用。

    在C#程序编写过程中,会遇到:Resx 文件无效.未能加载 .RESX 文件中使用的类型 System.Collections.Generic.List1`请确保已在项目中添加了必需的引用. 主要原因 ...

  4. java pdf 修改内容_生成PDF全攻略之在已有PDF上添加内容的实现方法

    项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...

  5. 学界:为代码自动添加注释,让 Java 程序的阅读和开发更高效

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 People do a lot of thinking, and so ...

  6. 转:R语言在已有图形上面添加一条直线

    如何在已有图形上面添加一条直线? 使用abline()函数.示例代码如下. >x <- c(1.0, 2.0, 3.0, 4.0, 5.0) >y <- c(1.0, 1.9, ...

  7. Runtime objc4-779.1 为什么不能向一个已存在的类添加成员变量?有什么办法达到相同的效果(2)?

    接上一篇博客继续 第二种方法 Func2 利用关联实现对已存在的类添加成员变量的效果 涉及两个主要的API 给某一个对象关联一个对象 objc_setAssociatedObject(id _Nonn ...

  8. java注释里加_如何在代码中添加注释

    什么是代码注释,如何在代码中添加注释,相信每一位了解编程的人并不陌生.注释里往往有很多有趣的脑洞和「真心话」.今天我们一起去看看那些6到飞起,被玩坏了的幽默注释吧. 信息量太大的注释系列-- 1.你造 ...

  9. 操作系统 MIT JOS lab4 超详细过程,附已通过代码

    操作系统 MIT JOS lab4 本次实验主要内容: (1)多处理器系统 (2)抢占式调度 (3)类似UNIX的fork--创建子进程,以及写时复制的机制 (4)进程间通信 附有注释详细的已通过代码 ...

最新文章

  1. 生物信息学 Python 入门之源码安装
  2. Spring中的异步任务
  3. activiti框架 数据库设计说明书
  4. python爬虫实例-记录一次简单的Python爬虫实例
  5. Windows Server AppFabric Beta 2 for For Vistual Studio 2010已经发布
  6. servlet action is not available
  7. Android4开发入门经典 之 第七部分:数据存储
  8. java中保留小数位_Java中保留两位小数的方法
  9. 负margin在布局中的运用(*****************************************************************)...
  10. Redmi小金刚系列七个月销量破2000万台 Note8系列新品即将发布
  11. linux 重复模式元字符,Linux 正则表达式 vi, grep, sed, awk
  12. [转]何为C10K问题
  13. 如何通过配置tomcat或是web.xml让ie直接下载txt类型的文件
  14. AS技巧合集「常用技巧篇」
  15. 基于java的生信软件_常用生物信息学软件介绍和文献依据.docx
  16. 外文文献找不到怎么办?
  17. reached getOption(“max.print”)
  18. 自己动手写java虚拟机(第一话)
  19. OSChina 周一乱弹 —— 鱼生不值得
  20. windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!!

热门文章

  1. win下实现Linux的tab自动补全
  2. API经济正在牵制技术的改革
  3. 赛门铁克第三财季运营业绩稳步增长
  4. zabbix通过自动发现功能实现自动识别网络设备接口
  5. windows环境下VS2013编译openSSL
  6. 较老版本 AFNetworking 使用心得
  7. 处理动态SQL语句的参数
  8. linux命令学习——tar
  9. 开发ASP.NET下的MP3小偷程序
  10. HTTP GET 和 POST 的区别