控制反转(Inversion of Control)大大降低了代码的耦合性。实例是由容器注入到对象中,而不是主动创建的。
IoC将对象生成放置在配置文件中,只需要修改配置文件就可以更换实现类。
实现简单的IOC
public interface Action { public String execute(String str); } public class UpperAction implements Action { private String message; public String getMessage() { return message; } public void setMessage(String string) { message = string; } public String execute(String str) { return (getMessage() + str).toUpperCase(); } } public class LowerAction implements Action { private String message; public String getMessage() { return message; } public void setMessage(String string) { message = string; } public String execute(String str) { return (getMessage() + str).toLowerCase(); } }
public class ActionFactory { public static Action getAction(String actionName) { Properties prop = new Properties(); try { ClassLoader loader = ActionFactory.class.getClassLoader(); prop.load(loader.getResourceAsStream("config.properties")); String actionImplName = (String) prop.get(actionName); String actionMessage = (String) prop.get(actionName + "_msg"); Class cl = Class.forName(actionImplName); Object obj = cl.newInstance(); // 反射机制获取域参数并为域参数值注入值 Field[] fields = cl.getDeclaredFields(); Field field = fields[0]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); String setMethodName = "set" + firstLetter + fieldName.substring(1); Method setMethod = cl.getMethod(setMethodName, new Class[] { field.getType() }); setMethod.invoke(obj, new Object[] { actionMessage }); return (Action) obj; } catch (Exception e) { e.printStackTrace(); } return null; } }
config.properties配置文件:
TheAction=test.UpperAction
TheAction_msg=Hello
public class TestAction { public static void main(String[] args) { Action action = ActionFactory.getAction("TheAction"); System.out.println(action.execute(“ World ")); } }
输出结果:
HELLO WORLD
设计模式—代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户端不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理的常见应用就是对遗留系统的封装。
代理模式一般涉及到的角色有
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象角色一般内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是最终要引用的对象
代理模式-原理图
代理类和被代理类均派生自同一个接口,被代理类对象作为代理类构造函数参数的方式将代理权交出,代理类有接口中定义的方法,还有其他事务处理方法。
代理模式-时序图
代理模式-例子
public interface UserDAO { public void saveUser(User user); }
public class UserDAOImpl implements UserDAO { @Override public void saveUser(User user) { System.out.println("save a user," + "Id:" + user.getId() + ",Name:" + user.getName()); } }
public class UserDAOProxy implements UserDAO { private UserDAO userDAO; public UserDAOProxy(UserDAO userDAO) { this.userDAO = userDAO; } @Override public void saveUser(User user) { startTransaction(); userDAO.saveUser(user); endTransaction(); } private void startTransaction() { System.out.println("start transaction."); } private void endTransaction() { System.out.println("end transaction."); } }
public class User { private Integer id; private String name; public User(Integer id, String name) { super(); this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Test { public static void main(String[] args) { UserDAO userDAO = new UserDAOProxy(new UserDAOImpl()); userDAO.saveUser(new User(1, "Peter")); } }
输出:
start transaction.
save a user,Id:1,Name:Peter
end transaction.
由以上代码可以看出,客户实际需要调用的是UserDAOImpl类的saveUser()方法,现在用UserDAOProxy来代理UserDAOImp类,同样达到目的,同时还进行了事务的处理,当然还可以处理一些其他问题,如安全、日志等。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。(待续)
相关推荐
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
麒麟win10双系统重新安装win10后麒麟启动菜单看不到解决方法
多邻国Duolingo v6.0.3 高级版.apk
QT网络编程: 实现TCP通讯设置(客户端)
减少重复造轮子,开源微信小程序商城(前后端开源:uniapp+Java)。快速搭建一个属于自己的微信小程序商城。
彩虹云商城 最新彩虹代刷V6.9.0免授权纯净完整版 直接上传源码解压缩后访问域名安装即可,亲测可用 彩虹自助下单系统 安装说明: 上传到空间后直接访问即可根据提示安装。 PHP推荐使用7.0及以上版本 V6.9 1.修复SQL注入漏洞 2.修复后台微信QQ扫码登录 V6.8.5 1.修复亿乐对接 2.新增支持倍数输入框 V6.8 1.更新全新的faka模板 2.新增微信快捷登录 3.新增批量下单功能 4.防CC配置新增滑动验证码模式 5.修复部分地区后台加载错误 6.修复https网站对接http支付接口 7.后台登录支持微信QQ扫码登录
MyBatis-Plus学习思维导图
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
分布式搜索引擎ElasticSearch思维导图
网鼎杯
网络安全入门教程(工具版)
科普里控制器调试软件工具使用 win64环境安装
内容概要:本文档详细介绍了GC9503V单片机a-Si TFT LCD驱动器的技术规格,包括主要特点、内部结构图、引脚定义以及系统接口等。GC9503V支持480x864分辨率,16.7百万色显示,无内置GRAM。文章还提供了详细的引脚尺寸、对齐标记尺寸、芯片信息以及接口模式控制的序列实例,如DCS写入命令及其参数。 适合人群:LCD显示屏设计人员、嵌入式系统工程师、电子硬件开发者和技术研究人员。 使用场景及目标:帮助开发者快速理解和应用GC9503V在实际产品中的具体使用方法,掌握LCM与MCU之间的数据交互方式,实现高效的屏幕驱动设计。 其他说明:GalaxyCore公司保留在不事先通知的情况下更改文档内容的权利。
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
某酒店排水课程设计计算书.doc
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在四川2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据