Netbeans Platform的Lookup -- 边学边记

学习参考资料: 

http://bugu1986.iteye.com/blog/945714

http://www.blogjava.net/tingfeng/articles/295467.html 

http://hulles.supersized.org/archives/23-Tips-on-Using-Lookup-in-NetBeans.html

https://blogs.oracle.com/geertjan/entry/lookup_example 

http://platform.netbeans.org/tutorials/nbm-quick-start.html 
http://platform.netbeans.org/tutorials/nbm-selection-1.html 


个人总结--为什么使用和如何使用:

  关于Lookup的用途或者说好处,宏观上讲,就一个 -- 解耦,但使用的场景不止一种,以至于你也可以说用途不止一种,并且每种用途的具体编码方式有多种且或许这些不同编码方式运行后的效果也有区别(本菜鸟现在还不了解detail),这一切也是我觉得Lookup让人头疼的原因。 

  (1)我首先跟着http://platform.netbeans.org/tutorials/nbm-quick-start.html 的步骤做,在还没进行到"LookupListener and InstanceContent"之前,我对Lookup的认识是:Lookup是一个查找工具,使用Lookup能方便的通过接口得到其实现类对象的集合,从而使接口使用者与接口实现者解耦。 

  (2)当我做完"LookupListener and InstanceContent"以后,我惊奇于运行后的效果但看不懂关键代码的实现逻辑,因为例子里面的讲解太少,都是具体操作。看来作者是故意吊读者胃口,卖个关子吸引我继续看。但当时我并没有跟着作者的意思继续而是到网上搜索其他的相关讲解,试图找到更好的突破口(现在回过头来看觉得是自己走了弯路)。在花了接近一天时间看http://www.blogjava.net/tingfeng/articles/295467.html 和其他几篇文章以后仍然一头雾水。于是我回过头继续跟着http://platform.netbeans.org/tutorials/nbm-selection-1.html 做,在讲解和示例的帮助下有了一些发现,Lookup是一个包裹,或者说一个对象池(具体的存储方式,Lookup是一个Map,key是池中对象的Class,value是具体的对象,每一个池中的对象都可以用一个Lookup.Result对象来表示),这个池可以被监听(起码从命名上看是这样,"LookupListener"),实际上,监听器监听的是池中类的变化(在设置监听器的时候必须给出池中某类的类名),监听器在被触发时可以方便的从池中得到发生变化的类的对象。这样讲有些抽象,举个例子,现在有一个自定义类Man,有一个编辑窗口类Editor和一个属性窗口类Properties。我想实现在编辑窗口中编辑Man,并且在Properties窗口中能实时显示当前编辑的Man对象的属性信息,使用Lookup我们就可以这样实现:在Editor类中放一个Lookup(使类implements Lookup.Provider,然后使用associateLookup()方法创建Lookup),让Properties类监听对象池中Man对象的变化(implements LookupListener,result.addLookupListener()注册监听器 ,实现resultChanged()方法),这样,每当我在Editor里编辑一个Man的时候,Properties都能监听到池中Man对象的变化并实时得到这个Man对象(监听器只能监听当前正在获得焦点的那个Editor)。我们可以看到,Editor和Properties并不需要知道对方的存在,他们两个完全解耦了。

  (3)补充:

  ①(1)中的Lookup实质与(2)是一样的,只不过Lookup.getDefault()是netbeans自己维护的对象池。而通常我们定义自己的Lookup的时候,使用的是AbstractLookup()。参考:http://bugu1986.iteye.com/blog/945714  ,我猜netbeans是监听了用户自定义的接口,而Lookup.getDefault().lookup()在执行的时候其实是调用了监听器的监听方法,从而拿到'Lookup.Result<? extends [用户定义的接口]>'的(有时间再看到底对不对)。

  ②(1)中描述的意思其实就是http://www.blogjava.net/tingfeng/articles/295467.html 中的"2 依赖注射和解耦"。而他的"1 表现一个对象的能力 is a 和 has a的关系"是对我的(2)中Lookup作用的另外一种理解,只不过他并没有马上交代如何使用,这也是我原来困扰的地方,而且出于解耦的需要,Your code根本不需要知道Some object,他们之间用"interact with"来连接容易产生误会,我觉得改成下面的样子更容易理解。

   Your code  -->   Don't know 'Some object',wanna use some functions of Object1/Object2/Object3        Some object -- implements --> Lookup.Provider, Don't know 'Your code'

                |                                                                                                                                                  |__ has a Lookup Object -- maintain
                |                                                                                                                                                                                                |__ Object 1
                |                                                                                                                                                                                                |__ Object 2
    implements LookupListener                                                                                                                                                                       |__ Object 3 ...
                                                                                                                                                      

                                                                                                                       'Your code' and 'Some object' are  loosely-coupled

   (4)http://www.blogjava.net/tingfeng/articles/295467.html 中的后半部分要仔细看。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值