worldwind学习笔记-10-T T 工厂模式这么用啊
来源:互联网 发布:常州淘宝模特兼职 编辑:程序博客网 时间:2024/06/13 06:35
我了个去,我写的这个学习笔记根本不能看啊,啰嗦,而且抓不住重点,这章我想说我学到的所谓的针对接口的编程,似乎叫做面向接口编程吧。
ApplicationTemplate里面的AppPanel和AppFrame不复杂,但是个人认为他有些东西在本章还用不到,最好不要这么多。
所以,转看HelloWorldWind,比较简单的几行代码,一个main里面启动了内部类AppFrame,然后AppFrame里面设定自己的关闭方式是退出。
WorldWindowGLCanvas是个重量级的awt组件,可以和轻量级组件混合使用,所以他用jframe去添加WorldWindowGLCanvas对象是没有问题的,不过,在《Java2图形设计 卷2 SWING》一书中,开篇就在阐述两者区别,其中层序问题很重要,因为轻量级组件的层序和他的容器相同,重量级组件如果加在轻量级组件容器上方,所有该容器的轻量级组件都会被覆盖,所以WWj的示例源码里,有些有目录的(如KMLViewer),点击目录,内容是被盖掉的。(java 1.7的后面的版本把这个修复了)
WorldWindowGLCanvas=>GLCanvas=>Canvas=>Component,所以他是awt的组件。
getCaps方法是用来初始化OpenGL性能的,DepthBits是位深,就是平时我们所说的16色增强色,24色真彩色等,不过为何我设置之后仍旧不影响实际效果,我就不知道了。
然后。。神奇的代码出现了:((WorldWindowGLDrawable) WorldWind.createConfigurationComponent(AVKey.WORLD_WINDOW_CLASS_NAME));
WorldWindowGLDrawable是一个接口,要实现三个方法,他们使用createConfigurationComponent来产生对象,Stringgov.nasa.worldwind.avlist.AVKey.WORLD_WINDOW_CLASS_NAME = "gov.nasa.worldwind.avkey.WorldWindowClassName" 这是后面AVkey对应的值,曾经阅读大话设计模式的时候,我就被逼疯过,我完全不理解为何要有工厂模式,简单工厂模式,虚拟工厂模式等,他无非就是给new套上了外衣,代码量没少,所谓的功能增加方便,还是要去修改这里的代码,并且还要再写实现类,他将代码变得更复杂但是我并没有体会到他的好处。
我在我们程序的数据库连接类那里用了一次这种设计模式,一个IDB接口,一个DBFactory来构造,对sqlserver,oracle,access写了三种实现,可是由于jdbc使用的sql语句会略有不同,比如时间对比,sqlserver可以用between '2013-12-5' and '2013-12-6' 但是access就要写成between #2013-12-5# and #2013-12-6#,我虽然封装了支持类,但是真正实现的时候,(╯‵□′)╯︵┻━┻仍旧蛋疼的要写不同的sql语句啊,╮(╯_╰)╭让我觉得构造模式没有让我的代码更出彩或者更易懂更好维护。
不过看到wwj的代码,我明白了,这真是神奇的东西,原来还有类加载器这一说,我读java核心编程基础知识时,有这么一章,我当想说看了下,并没有去敲敲代码,而且我也不觉得我会去构造工具,而书上说如果对构造工具没兴趣,可以跳过本节。。。。我当时跳过去了啊,最后还是要返回来读。
wwj利用Class的反射能力,构造了一个不太一样的工厂。
/** * @param classNameKey the key identifying the component * * @return the new component * * @throws IllegalStateException if no name could be found which corresponds to <code>classNameKey</code> * @throws IllegalArgumentException if <code>classNameKey<code> is null * @throws WWRuntimeException if the component could not be created */ public static Object createConfigurationComponent(String classNameKey) throws IllegalStateException, IllegalArgumentException { if (classNameKey == null || classNameKey.length() == 0) { Logging.logger().severe("nullValue.ClassNameKeyNullZero"); throw new IllegalArgumentException(Logging.getMessage("nullValue.ClassNameKeyNullZero")); } String name = Configuration.getStringValue(classNameKey); if (name == null) { Logging.logger().log(Level.SEVERE, "WorldWind.NoClassNameInConfigurationForKey", classNameKey); throw new WWRuntimeException( Logging.getMessage("WorldWind.NoClassNameInConfigurationForKey", classNameKey)); } try { return WorldWind.createComponent(name.trim()); } catch (Throwable e) { Logging.logger().log(Level.SEVERE, "WorldWind.UnableToCreateClassForConfigurationKey", name); throw new IllegalStateException( Logging.getMessage("WorldWind.UnableToCreateClassForConfigurationKey", name), e); } }Configuration在上节中提到了,是一个单例模式的,所以他提供了整个系统的核心级配置。
而他又在AVKey中定义了大量的Key值,这些Key值存储在配置文件中当name用,value才是真类名,绕了这么一圈,就是为了能让代码成为一种插入式代码,只需要修改配置文件,然后在jar同目录下提供好class文件或者打好的jar包,就能让jvm的类加载器去找这个类,并且产生该类的对象。
所以代码最终导致:WorldWindowGLDrawable这个接口的实现类是:gov.nasa.worldwind.WorldWindowGLAutoDrawable
这里有一段我不太明白的继承树
WorldWindowGLAutoDrawable=》WorldWindowImpl=》WWObjectImpl=》AVListImpl
这一系列的集成难道只是为了支持javabean吗。
在通过构造器产生了WorldWindowGLDrawable的实例后,还需要给他做些设置,就是初始化绘图,初始化Gpu的数据。
紧接着,作为WorldWindowGLCanvas这个重量级画布,他还实现了View和InputHandel两个东西,
View也是通过构造器产生的,是gov.nasa.worldwind.avkey.ViewInputHandlerClassName。
InputHandel也是通过构造器产生的,是gov.nasa.worldwind.awt.AWTInputHandler。
这种方式,就保证了这部分的代码都是面向接口的编写,调用的也是面向接口的方法,当需要显示非地球的东西,或者对view进行扩充,都只需要增加一个类,然后修改配置文件就可以了,工厂模式这么用,真的让我觉得,模式白学了。
在他们的Design and Coding Guidelines里面也推荐了几本书,Core Java,The Java programming Language等,并且他说他们读了一遍又一遍,看来,我也需要大量的阅读和写代码,才能有这样子的高端视角。才能更好的设计我的程序和代码,让他更健壮更强大。
- worldwind学习笔记-10-T T 工厂模式这么用啊
- T-SQL学习笔记
- T-SQL 学习笔记
- T SQl学习笔记
- T-SQL学习笔记
- T-SQL学习笔记
- T-SQL 学习笔记
- t-SNE学习笔记
- \t\t谭浩强 C++ 学习笔记
- worldwind学习笔记-9-从头开始,单例模式
- \t\t外观模式
- \t\t组合模式
- T-SQL学习笔记(1)
- [转]T-SQL学习笔记
- 学习笔记T-SQL(1)
- T-SQL基础 学习笔记
- 操作系统学习笔记_AT&T
- AT&T汇编学习笔记
- dhtmlxtree学习笔记二(常用方法)
- dhtmlxtree学习笔记三(ajax动态获取数据)
- cxf 与 spring整合
- 不要将两个指针变量指向同一块动态内存
- eclipse 发布web工程,修改tomcat端口
- worldwind学习笔记-10-T T 工厂模式这么用啊
- dhtmlxgrid 使用json数据 入门
- SAP Sybase ASA 如何跟踪SQL语句
- dhtmlxgrid 常用功能介绍
- MIME Type 与 Content-Type 的关系
- html 设置字符编码集
- Service: 监听外部存储设备
- web service 对外发布一个hello world接口(入门)
- wsdl2java 调用webservice接口