如何实现在已有代码之后添加逻辑之继承,组合(静态代理)实现方法
发布日期:2021-08-21 13:17:55 浏览次数:10 分类:技术文章

本文共 1557 字,大约阅读时间需要 5 分钟。

我们来看看这个问题:在已经实现的功能上如何再添加其他功能?如在一个类中有一个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{
@Override
public  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

转载地址:https://blog.csdn.net/weixin_33720078/article/details/93686955 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Flutter视图基础简介--Widget、Element、RenderObject
下一篇:[HAOI2007]上升序列

发表评论

最新留言

表示我来过!
[***.240.166.169]2023年02月28日 17时02分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

java 8 switch用法_Java14新特性:Switch表达式 2019-12-06 20:23:33
java 泛型类型擦除后获得类型_Java泛型类型擦除以及类型擦除带来的问题 2019-12-06 20:23:33
java启动设置堆内存参数_005. 深入JVM学习—Java堆内存参数调整 2019-12-06 20:23:33
java怎么算数_JAVA初学者——算数运算符 2019-12-06 20:23:34
chrome嵌入式java_java – 在Chrome中的Vaadin Subwindow中显示嵌入式PDF 2019-12-06 20:23:34
dht 爬虫 java_[C#搜片神器] 之P2P中DHT网络爬虫原理 2019-12-06 20:23:34
java pcm16位_Java C.ENCODING_PCM_16BIT属性代码示例 2019-12-06 20:23:32
java list是否存在_JSTL判断一个list集合里是否包含某个字符串详解 2019-12-06 20:23:32
django使用mysql原始语句_Django执行源生mysql语句实现过程解析 2019-12-06 20:23:32
java variant类型_Java UUID variant()用法及代码示例 2019-12-06 20:23:32
java局域网聊天_java局域网聊天小程序 2019-12-06 20:23:32
python模拟登陆遇到重定向_python requests模拟登陆出现重定向的问题? 2019-12-06 20:23:32
voltdb mysql_MySQL/HandlerSocket和VoltDB:NoSQL的竞争者 2019-12-06 20:23:33
python视频换脸下载_Faceswap拍照换脸软件电脑版(faceswap gui视频换脸)1.2官方版 2019-12-06 20:23:30
java 地图api接口_Java调用百度地图API 2019-12-06 20:23:30
java反射获得属性值_java反射取对象属性值 不是通过get方法取值? 2019-12-06 20:23:31
java repaint闪烁_java - 在Java中调用repaint()时如何避免闪烁? - 堆栈内存溢出 2019-12-06 20:23:31
支付宝 java 签名算法_(支付宝)签名与验签 2019-12-06 20:23:31
java wifi定位原理_使用基站、wifi实现定位 2019-12-06 20:23:31
matlab求二阶方阵对角化_梳理:矩阵对角化 2019-12-06 20:23:29