`

动态解耦 静态解耦

 
阅读更多

1.静态解耦:
    先解释下我理解的静态耦合,指的是编译期依赖关系已经确定,在运行时环境中,代码间的依赖关系不能改变。例如,我们在开发中经常会说的“把代码写死了”。静态是相对动态的、运行时的、可配置的和插件式的。
    那么在静态环境中,如何解耦?主要是依赖接口。下面举两个小例子简单说明下:
    EX1: 假设一个人不知道接口的意义,那么他写出两个类的依赖关系一般如下:

Java代码  收藏代码
  1. public   class  ClassA {  
  2.     public   void  invoke() {  
  3.     [color=blue]ClassB b = new  ClassB();  
  4.     b.action();[/color]         //do some other things   
  5.     }  
  6. }  
  7.   
  8. public   class  ClassB {  
  9.     public   void  action() {  
  10.     //do something   
  11.     }  
  12. }  


   我们常常说的“耦合”,我认为一个重要的因素就是环境的变,如果没有变化的环境,那么多么的“耦合”也是无所谓的;假如现在变化来了,ClassA中的 invoke()方法不符合现在的需求了,而且需要改变的部分恰好是invoke()中的前两行,也正是和ClassB耦合的那部分,而ClassB的 action方法还在别的代码有调用。现在如果更改,则必须修改invoke()的前两行代码。这个是面向对象中非常忌讳的。所谓代码应该对扩展开放,对修改封闭 ,那么我们用“面向接口编程”的思想对他进行一下改造吧。

Java代码  收藏代码
  1. public   class  ClassA {  
  2.     public   void  invoke() {  
  3.     Interface i = Factory.newInstance().produce(1 );  
  4.     i.action();  
  5.     }  
  6. }  
  7. public   class  Factory {  
  8.     private   static  Factory f =  new  Factory();  
  9.       
  10.     public   static  Factory newInstance() {  
  11.     return  f;  
  12.     }  
  13.       
  14.     public  Interface produce( int  k) {  
  15.     if (k ==  0 ) {  
  16.         return   new  Imp1(); //接口的实现类1   
  17.     } else   if  (k ==  1 ){  
  18.         return   new  Imp2(); //接口的实现类2   
  19.     }//other implements   
  20.           
  21.     return   new  DefautImpl();  
  22.     }  
  23. }  


   现在的情况稍好一点了,至少我们把变化集中管理在了一个工厂类中,但是,如果有变化,我们还是要深入代码去修改这个工厂类,依赖关系仍旧局限于编译期;
    难道没有解决办法了吗?当然有,那就是我理解的动态解耦。

2.动态解耦
    所谓动态是对象之间的依赖关系不依赖于编译期,运行时动态确定。动态解耦与插件式,可配置具有某种意思的巧合。套用某句话,正是因为有了动态解耦技术,代码间的依赖关系才真正解脱了。  
    动态解耦所用的技术主要是反射机制并结合配置文件。下面是一个例子,仅仅演示什么是动态的(很粗糙的。。)

Java代码  收藏代码
  1. public   class  Main {  
  2.   
  3.     /**  
  4.      * @param args  
  5.      */   
  6.     public   static   void  main(String[] args) {  
  7.         BufferedReader reader = new  BufferedReader( new      InputStreamReader(System.in));  
  8.           
  9.         while ( true ) {  
  10.             String instruction = null ;  
  11.             try  {  
  12.                 instruction = reader.readLine();  
  13.             } catch  (IOException e) {  
  14.                 e.printStackTrace();  
  15.                 System.exit(-1 );  
  16.             }  
  17.               
  18.             if ( "exit" .equalsIgnoreCase(instruction)) {  
  19.                 break ;  
  20.             }  
  21.               
  22.             if ( "invoke" .equalsIgnoreCase(instruction)) {  
  23.                 //一个类和被调用类直接耦合在一起   
  24.                 Interface inter = loadFromCfgFile();  
  25.                 if (inter ==  null continue ;  
  26.                   
  27.                 inter.say("just say" );  
  28.             }  
  29.         }  
  30.   
  31.     }  
  32.   
  33.     private   static  Interface loadFromCfgFile() {  
  34.         InputStream in = MainClass.class .getResourceAsStream( "test.properties" );  
  35.         Properties p = new  Properties();  
  36.         try  {  
  37.             p.load(in);  
  38.         } catch  (IOException e) {  
  39.             e.printStackTrace();  
  40.             return   null ;  
  41.         }  
  42.           
  43.         String className = p.getProperty("class" );  
  44.         System.out.println("class name loaded from config file is: "  + className);  
  45.           
  46.         Object object = loadClassAccordingClassName(className);  
  47.         if (object ==  null return   null ;  
  48.           
  49.           
  50.         return  (Interface) object;  
  51.     }  
  52.   
  53.     private   static  Object loadClassAccordingClassName(String className) {  
  54.         Class<?> clazz = null ;  
  55.         try  {  
  56.             clazz = Class.forName(className);  
  57.         } catch  (ClassNotFoundException e) {  
  58.             System.out.println("can not find the class." );  
  59.         }  
  60.         if (clazz ==  null return   null ;  
  61.           
  62.         Object object = null ;  
  63.         try  {  
  64.             object = clazz.newInstance();  
  65.         } catch  (InstantiationException e) {  
  66.             System.out.println("can not instance the class." );  
  67.             e.printStackTrace();  
  68.         } catch  (IllegalAccessException e) {  
  69.             System.out.println("can not instance the class...." );  
  70.             e.printStackTrace();  
  71.         }  
  72.         return  object;  
  73.     }  
  74.   
  75. }  



实现类代码:

Java代码  收藏代码
  1. public   class  ImplementClass  implements  Interface{  
  2.   
  3.     public   void  say(String str) {  
  4.         System.out.println("say "  + str);  
  5.                   //System.out.println("added later.");//   
  6.   
  7.     }  
  8.   
  9. }  



配置文件代码:

Java代码  收藏代码
  1. class =ImplementClass  



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

分享到:
评论

相关推荐

    基于过程神经网络的六维力传感器动态解耦研究.pdf

    解耦算法主要集中在静态解耦方面,例如基于线性标定和基于最小二乘线性拟合的解耦算法都是将六维力传感器看成线性系统。在动态解耦方面,文献[2]提出不变性动态解耦方法和迭代解耦方法,从本质上揭示了多维力传感器...

    感应电动机的解耦控制与矢量控制的解耦性质

    对感应电动机的解耦控制及...研究结果表明,感应电动机的矢量控制只能实现电机转速与转子磁链之间的静态解耦,不 能实现二者之间的动态解耦,而基于状态反馈线性化的解耦控制方法,能够实现转速与转子磁链之 间的动态解耦

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

    解耦的方法有很多,如静态解耦、动态解耦等。静态解耦通过适当的坐标变换,使每个输出仅受一个输入的影响,而动态解耦则涉及更复杂的控制器设计,例如采用自适应或鲁棒控制策略。 在“gaiPID-zhongyao1.m”文件中,...

    线性系统理论-第四章5:静态解耦.ppt

    举例来说,如果考虑一个动态方程系统,通过应用定理4-15的条件,我们可以验证该系统是否可以通过状态反馈实现静态解耦。如果系统是可控的,且满足静态解耦的矩阵条件,那么就可以实现静态解耦。然而,如果E矩阵是...

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

    2. **控制器设计**:接着,采用各种解耦策略,比如动态解耦、静态解耦或部分解耦,来设计控制器。动态解耦通常涉及状态反馈控制,而静态解耦则可能通过坐标变换来实现。 3. **性能评估**:设计出控制器后,需要对其...

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

    解耦控制器的设计方法包括静态解耦、动态解耦以及自适应解耦等。 1. 静态解耦:这种方法涉及到找到一组线性变换,将原系统转换为一组独立的SISO系统。这可以通过计算系统的特征值和特征向量来完成,然后构建一个...

    matlab开发-静态空间系统的输入解耦零可滚动特征值

    在MATLAB环境中,静态空间系统的输入解耦是一个重要的控制理论问题。这个话题主要涉及系统理论中的线性系统分析,特别是控制系统的设计与优化。输入解耦是实现系统控制目标的一种手段,它旨在通过适当的控制器设计,...

    无陀螺惯性测量组合静动态解耦方法 (2007年)

    无陀螺惯性测量技术是利用加...该方法克服了静态解耦和动态解耦分别进行带来的处理复杂性,简化了后续处理系统.最后进行了系统3个方向角速度运算的仿真验证,结果表明,系统经静动态解耦后导航精度得到了有效提高.

    guochengkongzhi.rar_解耦_过程控制

    2. 解耦控制的基本原理:介绍常见的解耦方法,如静态解耦、动态解耦、线性矩阵不等式(LMI)方法等,以及它们的数学模型和设计步骤。 3. 控制器设计:详述如何设计控制器来实现解耦,如利用状态反馈、输出反馈或...

    JAVA高级:根据接口解耦示例

    7. **接口的静态方法(Static Methods)**:同样自Java 8引入,接口也可以包含静态方法。这些方法与接口的实例无关,可以直接通过接口名调用,用于提供工具类的功能。 8. **接口的常量(Constants)**:接口通常也...

    基于DSP交流异步电机电压解耦矢量控制.pdf

    通过矢量的坐标变换,使交流异步电机获得如同直流电机一样良好的动、静态调速特性。 知识点2:数学模型 交流异步电机的数学模型可以用下面的方程式描述: 定子:uM1=(R1+Lsp)iM1-ω1LsiT1+ LmLr pψ2 uT1=(R1+...

    线性系统解耦控制问题讲解PPT学习教案.pptx

    线性系统的解耦控制是控制...综上所述,线性系统解耦控制涉及到系统理论的多个方面,包括状态空间模型、反馈控制、动态解耦和静态解耦,以及跟踪控制。理解这些概念和方法对于设计高效、稳定的复杂控制系统至关重要。

    基于电流解耦的永磁同步电机MATLAB仿真研究.pdf

    文章还指出,矢量控制虽然解决了电流分量的静态解耦问题,但并未消除d-q轴电压之间的动态耦合。电流反馈解耦技术是一种在控制器输入端补偿电机电压模型中耦合关系的方法,能够实现电压的完全解耦。 最后,文章通过...

    qiankuijieou_statcom_双环控制_电压环投入_dq变换_电流内环解耦

    在电力电子领域,STATCOM(Static Synchronous Compensator,静态同步补偿器)是一种用于电压稳定和无功功率补偿的电力设备。它通过电压源逆变器(VSI)工作,能够快速调节电网的电压和无功功率。本文将详细讨论...

Global site tag (gtag.js) - Google Analytics