1.静态解耦:
先解释下我理解的静态耦合,指的是编译期依赖关系已经确定,在运行时环境中,代码间的依赖关系不能改变。例如,我们在开发中经常会说的“把代码写死了”。静态是相对动态的、运行时的、可配置的和插件式的。
那么在静态环境中,如何解耦?主要是依赖接口。下面举两个小例子简单说明下:
EX1: 假设一个人不知道接口的意义,那么他写出两个类的依赖关系一般如下:
public class ClassA {
public void invoke() {
[color=blue]ClassB b = new ClassB();
b.action();[/color] //do some other things
}
}
public class ClassB {
public void action() {
//do something
}
}
我们常常说的“耦合”,我认为一个重要的因素就是环境的变,如果没有变化的环境,那么多么的“耦合”也是无所谓的;假如现在变化来了,ClassA中的invoke()方法不符合现在的需求了,而且需要改变的部分恰好是invoke()中的前两行,也正是和ClassB耦合的那部分,而ClassB的action方法还在别的代码有调用。现在如果更改,则必须修改invoke()的前两行代码。这个是面向对象中非常忌讳的。所谓代码应该
对扩展开放,对修改封闭,那么我们用“面向接口编程”的思想对他进行一下改造吧。
public class ClassA {
public void invoke() {
Interface i = Factory.newInstance().produce(1);
i.action();
}
}
public class Factory {
private static Factory f = new Factory();
public static Factory newInstance() {
return f;
}
public Interface produce(int k) {
if(k == 0) {
return new Imp1();//接口的实现类1
} else if (k == 1){
return new Imp2();//接口的实现类2
}//other implements
return new DefautImpl();
}
}
现在的情况稍好一点了,至少我们把变化集中管理在了一个工厂类中,但是,如果有变化,我们还是要深入代码去修改这个工厂类,依赖关系仍旧局限于编译期;
难道没有解决办法了吗?当然有,那就是我理解的动态解耦。
2.动态解耦
所谓动态是对象之间的依赖关系不依赖于编译期,运行时动态确定。动态解耦与插件式,可配置具有某种意思的巧合。套用某句话,正是因为有了动态解耦技术,代码间的依赖关系才真正解脱了。
动态解耦所用的技术主要是反射机制并结合配置文件。下面是一个例子,仅仅演示什么是动态的(很粗糙的。。)
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while(true) {
String instruction = null;
try {
instruction = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
if("exit".equalsIgnoreCase(instruction)) {
break;
}
if("invoke".equalsIgnoreCase(instruction)) {
//一个类和被调用类直接耦合在一起
Interface inter = loadFromCfgFile();
if(inter == null) continue;
inter.say("just say");
}
}
}
private static Interface loadFromCfgFile() {
InputStream in = MainClass.class.getResourceAsStream("test.properties");
Properties p = new Properties();
try {
p.load(in);
} catch (IOException e) {
e.printStackTrace();
return null;
}
String className = p.getProperty("class");
System.out.println("class name loaded from config file is: " + className);
Object object = loadClassAccordingClassName(className);
if(object == null) return null;
return (Interface) object;
}
private static Object loadClassAccordingClassName(String className) {
Class<?> clazz = null;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
System.out.println("can not find the class.");
}
if(clazz == null) return null;
Object object = null;
try {
object = clazz.newInstance();
} catch (InstantiationException e) {
System.out.println("can not instance the class.");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("can not instance the class....");
e.printStackTrace();
}
return object;
}
}
实现类代码:
public class ImplementClass implements Interface{
public void say(String str) {
System.out.println("say " + str);
//System.out.println("added later.");//
}
}
配置文件代码:
class=ImplementClass
你可以简单的修改ImplementClass.java的代码,加上注释掉的语句,编译后,就会发现输出和以前不同了。
如上所示,代码间的依赖关系,从源代码中移动到了配置文件中,并利用反射技术来动态确定其依赖关系;好处就是依赖集中管理、符合开放封闭原则;
对配置文件的修改产生的变化,还有一种更优雅的方式,可以启动一个守护线程对其进行定期检查,如变化,可重新加载并实例化,这个以后再续;
分享到:
相关推荐
此仿真模型用matlab/simulink2018b搭建,验证了复矢量解耦算法,该模型可明显对比出复矢量解耦算法的作用,以及永磁同步电机dq轴间的耦合效应,且其中包含了原理讲解及个人的理解。
通俗易懂,讲解很好,易理解,案例明确,过程清晰,很实用。
速度闭环模型(速度+电流双闭环),FOC部分根据自己理解来搭建,步骤简单易理解,电流闭环部分增加了 解耦,时候参考和交流。欢迎私信交流
本模型是在永磁同步电机矢量控制基础上加入了反馈解耦,且其中有原理讲解及个人对解耦算法的理解,此模型可直观对比出加入解耦算法及没有解耦算法的dq轴电流波形,突出dq轴间的耦合效应反馈解耦算法的作用。
1、资源内容:基于Matlab模糊控制实现解耦控制(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、解压说明:本资源需要电脑端使用...
1、资源内容:基于Matlab实现PID神经元网络解耦控制算法_多变量系统控制仿真(源码).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、解压...
1、资源内容:基于Matlab实现PID神经元网络解耦控制算法_多变量系统控制仿真(程序).rar 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为“参考资料”参考学习使用。 3、解压说明:本资源需要电脑端...
结果表明:所给出的解耦模型分析、仿真算法、仿真与真实结果以及对比分析不仅可用于车载平台利用光流开展位姿解耦估计中的误差分析和算法验证, 还对深入理解光流运动成像、开展无人车平台光流应用的研究具一定的借鉴...
方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案...
模块化设计:MMAction2 将统一的视频理解框架解耦成不同的模块组件,通过组合不同的模块组件,用户可以便捷地构建自定义的视频理解模型 支持多种任务和数据集:MMAction2 支持多种视频理解任务,包括动作识别,时序...
1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件...这样可以实现action程序代码与返回的jsp页面名称的解耦。
SPI(Service Provider Interface)是 Java 中一种基于接口的服务发现机制,旨在实现代码解耦和可扩展性。...对于 Java 基础编程,了解 SPI 机制能够帮助您更好地理解和使用不同的服务提供者,以及实现动态扩展功能。
可用于自用仿真学习,附带对应的详细说明及控制策略实现的paper,便于理解学习。 模型完整无错,可塑性高,可根据自己的需求进行修改使用。 包含仿真文件和说明 根据你提供的内容,我重新表述如下: 这是一个基于...
该框架只提供和设备对接部分(通过spring的bean注入解耦特性实现业务和协议实现分离), 使用此框架的客户必须遵循此框架设计的Api规范;接入一台设备只需创建两三个对象(协议的实现不算在内).并提供丰富的日志输出...
本书所覆盖到的将客户端与服务器解耦、分离资源与表现、解决HTTP表单提交的问题、管理URL以便于为其制作书签,加上很多其他的内容,都将会给你提供对于Ajax富有洞察力的全方位理解。 在这本书的帮助下,你能够编写...
实际要理解一个框架的类型,还是要自己看源码,这里我只说一下几个重要类型的作用,这个看源码的时候有个印象,也方便理解,而且说这部分的帖子也很多,我就不再赘述了。 1.Context 上下文组件定义程序边界,也就是...
面试官:Vue 中父子组件通信有哪些方式? 自己先想一分钟。 无可否认,现在无论大厂...有点扯了,回到主题,咳咳,那就谈谈我对上面的面试题的理解吧,文笔有限,不妥之处,欢迎在文章结尾留言斧正啊,正啊,啊! 概述
不仅实现电机侧的有功、无功功率的解耦控制和转速调节,而且能实现直流侧电压控制并稳定直流电压和网侧变换器有功、无功功率的解耦控制。 风速控制可以有线性变风速,或者恒定风速运行,对风力机进行建模仿真。 机侧...
时下流行的RxJava Retrofit Okhttp Mvp封装的一个demo,简单,易理解,深度解耦,方便迭代
IOC英文是Inversion of Control中文理解为控制反转,是Spring框架的一种设计思想。表示创建或者控制对象的权利由应用程序转换到Spring容器,如下将通过new关键字准确获取UserServiceImpl、UserMapperImpl类的权利...