- 浏览: 611231 次
文章分类
最新评论
-
q781253433:
qin ~.求demo看看~
Android之Widget -
zhongyuanceshi:
博主,没看到你的例子的Demo,共享下
Android之Widget
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.");//
- }
- }
配置文件代码:
你可以简单的修改ImplementClass.java的代码,加上注释掉的语句,编译后,就会发现输出和以前不同了。
如上所示,代码间的依赖关系,从源代码中移动到了配置文件中,并利用反射技术来动态确定其依赖关系;好处就是依赖集中管理、符合开放封闭原则;
对配置文件的修改产生的变化,还有一种更优雅的方式,可以启动一个守护线程对其进行定期检查,如变化,可重新加载并实例化,这个以后再续;
发表评论
-
System.out.printf输出格式
2012-12-13 22:01 2154// 定义一些变量,用来格式化输出。 double ... -
android分享功能的实现(分享到微博空间等)
2012-11-03 22:15 2166//Intent intent = new Inten ... -
Android开发环境配置
2012-11-03 20:04 8451、JDK安装: http://jing ... -
java,c,c++ 语言之间基本数据类型的比较
2012-08-24 14:31 1222原文:http://eric-gcm.iteye. ... -
堆栈&内存基础知识
2012-08-23 16:34 1368为了理解什么是堆栈缓 ... -
JAVA和C++的区别(转)
2012-08-23 13:45 879这是Java与C++区别的一个比较完整的答案,大家可以学习 ... -
java关键字null
2012-02-16 09:44 2099一、null是代表不确定的对象 Java中,n ... -
烽火学习笔记1
2012-02-15 22:17 1426Date 0808 Android 开发 ... -
notify notifyall wait 方法的使用
2012-02-14 14:14 922// object类的notify(),notify ... -
equals() 与 == 区别
2012-02-14 13:43 1075equals() 用来比较两个对象是否相等,即两个对象的内容是 ... -
OO原则:
2012-01-19 14:14 7941 封装变化 2 多用组合,少用继承 ... -
System 获取系统数据
2011-12-31 15:36 872System.out.println(System.get ... -
eclipse J2me环境配置
2011-12-09 16:39 3260用eclipse开发手机软件,尤其是J2me开发的时候,可以用 ... -
ps基础知识1--dpi ppi 认识
2011-11-17 14:15 291PPI与DPI区别: PPI(Pixel Per Inc ... -
操作系统学习1
2011-11-15 20:40 1018我们用一组简单的数学公式来描述操作系统的组成要素: ... -
Java虚拟机原理、内存分配和回收机制
2011-11-15 15:03 2889通常情况下Java编译过的代码是一些class ... -
程序员成长中的九重境界 你属于哪一重?
2011-10-29 10:02 723摘自:http://fellow.51ct ... -
json与xml比较
2011-10-27 17:14 1537JavaScript学习网站: http://www.c ... -
static 用法小结
2011-10-24 14:42 883用static修饰的类成员独立于任何类的对象,可以在实 ... -
单例模式
2011-10-11 13:51 894java 单例模式的好处 单例模式分三种:懒汉式单例、饿汉式 ...
相关推荐
对感应电动机的解耦控制及...研究结果表明,感应电动机的矢量控制只能实现电机转速与转子磁链之间的静态解耦,不 能实现二者之间的动态解耦,而基于状态反馈线性化的解耦控制方法,能够实现转速与转子磁链之 间的动态解耦
为了解决矢量控制只能实现电机转矩与磁链的静态解耦,不能实现两者的动态解耦的问题,探讨了多自由度内模解耦方案。由于一自由度内模解耦,当电机参数非同步变化时,电机定子电压方程仍存在耦合现象;而二自由度内模...
无陀螺惯性测量技术是利用加...该方法克服了静态解耦和动态解耦分别进行带来的处理复杂性,简化了后续处理系统.最后进行了系统3个方向角速度运算的仿真验证,结果表明,系统经静动态解耦后导航精度得到了有效提高.
matlab开发-静态空间系统的输入解耦零可滚动特征值。函数计算输入去耦零点,即系统的不可控特征值。
为了克服这一难题,结合大载荷低高度的传感器安装条件和结构特点,进行了实验研究,采用最小二乘法和独立成分法对比分析了传感器纵向受力工况下静态解耦效果,结果表明,Z方向与X,Y方向和MZ的静态解耦耦合率值均较小,独立...
针对无轴承异步电机多变量、非线性、强耦合的特点,提出一种基于支持向量机α阶逆...仿真和实验研究表明,支持向量机α阶逆系统方法能够实现无轴承异步电机悬浮力和旋转力之间的动态解耦,控制系统具有良好的动静态性能。
针对感应电机数学模型的非线性、强耦合特性,应用逆系统理论,将感应电机转矩与定子磁链动态解耦成2个一阶线性子系统,证明感应电机数学模型的可逆性。设计了基于逆系统方法的感应电机闭环控制系统。仿真结果表明这种...
在这项工作中,我们实施了最小几何变形解耦方法,以从最普通的各向同性溶液中,在包括宇宙常数$$ \ varLambda $$Λ的$$ 2 + 1 $$ 2 + 1维中,获得BTZ真空的常规静态内部溶液。 我们得到一般解只能通过原始各向同性...
结论信号解耦方法表明解耦器的存在性、可实现性和稳定性取决于耦合系统的结构及参数,重新匹配变量、部分解耦和静态解耦是其改变办法。信号解耦器设计方法简单有效,但多变量信号解耦器的连接比较复杂。
我们研究了静态自重力系统各向同性内部解的扩展,以通过通过最小几何变形方法实现的重力解耦来包括各向异性球对称重力源的影响。 特别是,详细研究了恒星表面与外部Schwarzschild时空的匹配条件,并且我们描述了如何...
根据放卷系统的工作机理,建立了放卷张力系统的非线性耦合数学模型,用ADRC方法推导了张力系统的解耦模型,得到了系统阶数和静态解耦模型.在放卷张力系统模型的基础上,利用ADRC技术对放卷系统的张力解耦...
采用新的解耦方法,依据独立和并网模式控制系统超调量越小,模式切换过程中被控量的波动越小。切换过程就越平滑的原则。完成了两种模式的控制器设计,即分别应用积分环节、比例环节即可将独立模式和并网模式整定成...
无轴承同步磁阻电机是一个复杂的多变量、强耦合非线性系统, 实现其非线性动态解耦控制是无轴承同步 磁阻电机稳定运行的前提.... 仿真结果表明该方法实现了系统的动态解耦, 并且具有良好的动、静态特性.</p>
永磁同步电机(PMSM)数学模型可简化为一个两输入两输出的非线性系统。神经网络具有逼近任意复杂非线性系统的能力,将经典比例一...仿真和实验结果表明该系统模型响应速度快,稳定性强,动、静态性能良好,鲁棒性很好。
我们对静态和球对称系统采用重力解耦方法来开发一种简单而有效的方法,以便(a)连续各向同性地爱因斯坦场方程的各向异性解,以及(b)生成新的自重力分布的解。 相同或消失的复杂度因子。 出于说明目的给出了一些...
级联多电平并网逆变器直接功率控制,有功武功可以实现解耦控制,动态和静态性能良好。
研究了一种袋式除尘器适用的控制模型,运用前馈补偿法设计了控制回路的解耦补偿器,仿真结果表明,解耦控制使得系统具有良好的动态和静态性能。
在系统分析六维力传感器线性解耦基本原理的基础上,依据各向同性指标比较分析了基于克拉默法则和最小二乘法线性解耦算法的优劣,建立了RBF神经网络非线性解耦模型。研究结果表明:与克拉默法则相比,最小二乘法得到...
耦合误差严重影响着六维力传感器的精度,标定试验的准确性对提高六维力传感器的精度也是必不可少的。针对传感器输出电压正负方向拟合函数不同...通过标定数据验证了基于耦合误差和分段拟合的静态解耦算法性能的优越性。