`
HelloJimmy
  • 浏览: 35557 次
  • 性别: Icon_minigender_1
  • 来自: LostTemple
社区版块
存档分类
最新评论

我理解的解耦

阅读更多
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的代码,加上注释掉的语句,编译后,就会发现输出和以前不同了。
    如上所示,代码间的依赖关系,从源代码中移动到了配置文件中,并利用反射技术来动态确定其依赖关系;好处就是依赖集中管理、符合开放封闭原则;
    对配置文件的修改产生的变化,还有一种更优雅的方式,可以启动一个守护线程对其进行定期检查,如变化,可重新加载并实例化,这个以后再续;


    
0
0
分享到:
评论
2 楼 wangluo19 2011-07-20  
看的稍微有点晕,楼主在定义接口的时候如果不用Interface看起来会舒服些。
很受启发
1 楼 kuchaguangjie 2010-01-16  
五毛,鉴定完毕

相关推荐

    gaiPID-zhongyao1.zip_MIMO PID 解耦_MIMO系统解耦_mimo_解耦_解耦控制

    在自动化控制领域,MIMO(Multiple Input Multiple Output,多输入多输出)系统是现代工业设备和工程系统中常见的控制架构。...因此,深入理解和掌握MIMO系统的PID解耦控制技术对于工程实践具有很高的价值。

    JIEOUqiankui_simulink里解耦_前馈解耦_前馈_matlab_解耦控制仿真

    在本文中,我们将深入探讨基于Simulink的解耦前馈控制仿真系统,这是一个在MATLAB...通过对"JIEOUqiankui.slx"文件的分析和仿真,我们可以深入理解解耦控制的原理,提高控制系统的性能,并为实际工程问题提供解决方案。

    基于Simulink 的解耦系统设计与仿真

    这些仿真实例不仅验证了解耦控制的有效性,还帮助理解不同解耦方法的性能差异。前馈补偿解耦法通过预估系统输出对输入的影响来消除耦合,反馈补偿解耦法则利用系统输出的反馈信息来调整控制信号。对角矩阵解耦法和...

    Main_Frequency1.rar_matlab悬置解耦_悬置优化_悬置位移计算_悬置解耦优化_悬置解耦计算

    用户可以通过这个界面输入参数、设置目标函数,并查看结果图示,以直观理解解耦和优化的效果。 综上所述,MATLAB在汽车悬挂系统的设计与优化中扮演了核心角色,通过其强大的计算能力和丰富的工具箱,可以实现悬置...

    spring深度解耦的由来

    首先,我们需要理解什么是“解耦”。在软件工程中,解耦是指将系统中的各个组件之间的依赖关系降到最低,使得每个组件都能独立地工作和更新,而不影响其他部分。在传统的软件设计中,模块间的高度耦合会导致维护困难...

    永磁同步电机复矢量解耦控制simulink2018b仿真模型

    在这个模型中,你可以直观地看到复矢量解耦算法在PMSM中的应用效果,对比未使用解耦算法前后的电机性能,从而深入理解解耦技术的重要性。 "原理讲解.txt"文件可能包含了关于永磁同步电机基本工作原理、矢量控制理论...

    decoupling-control.zip_Matlab 解耦_解耦 MATLAB_解耦 控制_解耦代码_解耦控制

    在这个“decoupling-control.zip”压缩包中,包含了20多个解耦控制的实例,这些实例覆盖了从基础到进阶的各种解耦技术,可以帮助用户逐步理解和掌握解耦控制的原理和应用。 解耦控制的实现通常包括以下步骤: 1. *...

    DDSRFSPLL.rar_DDSRFSPLL_双同步坐标系_解耦_解耦坐标系

    在这个DDSRFSPLL.slx文件中,很可能已经预设好了相关的解耦控制器结构、系统模型以及仿真参数,用户可以直接运行仿真,观察系统在不同条件下的动态响应,理解解耦效果。 解耦坐标系的选择对于控制系统的性能至关...

    decRation.rar_matlab 悬置_matlab悬置解耦_动力总成悬置_悬置_悬置解耦率计算程序

    本资料包"decRation.rar"专注于MATLAB环境下的悬置系统模态分析与解耦率计算,为工程师和研究人员提供了宝贵的工具。 首先,我们要理解什么是模态分析。模态分析是结构动力学领域的一种技术,用于研究结构在外界...

    matlab解耦控制

    在自动控制领域,解耦...总的来说,Matlab和Simulink为解耦控制提供了强大的平台,不仅可以帮助理解理论概念,还能方便地进行实际系统的设计、仿真和验证,对于学习和研究控制理论以及实际工程应用都有着极大的价值。

    pid.rar_神经网络解耦_系统解耦_解耦 MATLAB_解耦控制

    在现代控制系统设计中,多变量系统的解耦是一个关键问题,特别是在复杂的工业环境中。"pid.rar_神经网络解耦_系统解耦_解耦 MATLAB...这样的实践有助于加深对神经网络解耦原理的理解,提升在复杂系统控制中的设计能力。

    simulink:24 解耦控制系统23案例.zip

    每个案例可能包含特定的挑战,如非线性特性、时间延迟或参数不确定性,通过解决这些问题,你可以深化对解耦控制的理解,并提升控制设计技能。 总结来说,解耦控制系统是一个强大的工具,尤其对于复杂系统的设计和...

    Decoupling of Mode_悬置解耦程序matlab_汽车_悬置

    首先,我们来深入理解悬置解耦的概念。汽车悬置系统的主要目标是隔离路面传递给车身的振动,确保驾驶稳定性和乘客舒适度。然而,悬置系统通常由多个自由度组成,每个自由度可能具有不同的动态特性。当这些自由度相互...

    PID神经元网络解耦控制算法

    PID神经元网络解耦控制算法是一种融合了传统PID控制器与神经网络技术的先进控制策略,旨在提高系统的...同时,这也能帮助你深入理解PID神经元网络解耦控制算法如何在实际应用中发挥效用,增强你的控制理论与实践能力。

    OP104_Module5电力系统解耦.pdf

    解耦的目标在于理解实时仿真解耦的好处,掌握ARTEMIS电力线路的使用方法,了解状态空间节点(SSN)法,并掌握SSN节点接口模块的使用方法。电力系统实时仿真的解耦好处包括降低大系统仿真的复杂性,提高仿真的效率和...

    PQ解耦法 潮流计算 MATLAB程序

    PQ解耦法是一种在电力系统分析中广泛使用的潮流计算方法,主要应用于...通过这样的实践,学习者可以深入理解PQ解耦法的原理,提高电力系统分析的能力。同时,也可以对程序进行修改和扩展,适应更复杂的电力系统场景。

    decoupled_NR.m_牛拉法解耦_潮流_powerflow_

    解耦牛拉法(Decoupled Newton-Raphson)是一种在电力系统中广泛使用的潮流计算方法,用于求解网络...通过理解并掌握这种方法,电力工程师可以更好地理解和模拟电力系统的运行状态,为电网规划和运行控制提供关键支持。

    PID神经元网络解耦控制算法_多变量系统控制_神经网络控制_BP神经网络的数据分类_解耦控制系统_

    通过分析这个案例,我们可以深入理解PID神经元网络在解耦控制中的应用,以及如何通过BP神经网络处理数据,提高控制效果。 总结来说,PID神经元网络解耦控制算法是解决多变量系统控制问题的一种有效手段,它结合了...

    springboot 同步解耦 异步化

    在压缩包文件`showandshare.demo.syncevnet`中,可能包含了具体的示例代码或者教程,这些资源可以帮助你更深入地理解如何在SpringBoot项目中实践同步解耦和异步化。通过学习和实践这些示例,你可以掌握如何在实际...

Global site tag (gtag.js) - Google Analytics