<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>tjlvan</title>
    <description></description>
    <link>http://tjlvan.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>适配器模式在Eclipse开发中的运用</title>
        <author>tjlvan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tjlvan.javaeye.com">tjlvan</a>&nbsp;
          链接：<a href="http://tjlvan.javaeye.com/blog/230075" style="color:red;">http://tjlvan.javaeye.com/blog/230075</a>&nbsp;
          发表时间: 2008年08月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">
<p class="MsoNormal" style="TEXT-ALIGN: left"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">&nbsp;&nbsp; 适配器模式的在<span lang="EN-US">GOF23</span>中的定义是：将一个类的接口转换成客户希望的另外一个接口。</span><span style="font-family: Arial; mso-bidi-font-size: 10.5pt;">Adapter</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt;">模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。</span></span></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left"><span lang="EN-US"><span><span style="color: #666666; font-family: Arial; mso-bidi-font-size: 10.5pt;"><span style="color: #000000;"><span style="font-size: small; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">&nbsp;&nbsp; 适配器模式属于结构型模式，分为类的适配器模式与对象的适配器模式。它们的结构图如下所示：</span></span></span></span></span> </p>
<p style="text-align: center;"><img src="http://images.cnblogs.com/cnblogs_com/zxub/28484/o_adapter_class.JPG" height="197" alt="类的适配器模式" width="543" /></p>
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; tab-stops: 322.5pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">图</span><span style="font-size: 9pt; font-family: Arial;">1</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">类的适配器模式</span></p>
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; tab-stops: 322.5pt;">&nbsp;</p>
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; tab-stops: 322.5pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;"><img src="http://images.cnblogs.com/cnblogs_com/zxub/28484/o_adapter_object.JPG" height="197" alt="对象的适配器模式" width="524" /></span></p>
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; tab-stops: 322.5pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">图</span><span style="font-size: 9pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">2</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">对象的适配器模式</span></span></p>
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center; tab-stops: 322.5pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: small;"><span style="font-size: 10.5pt; font-family: Arial; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">作为一个扩展性很强的平台，那么内部类、接口如何在保持稳定的情况下对外提供更多的服务，在</span><span style="font-size: 10.5pt; font-family: Arial; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的设计上，采用适配器模式是一个很好的选择。</span></span></span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: small;"> <span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">在</span><span style="font-family: Arial;">Eclipse</span><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">开发中，适配器实现的方式主要有以下两种：</span></span></span></span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 14.2pt; TEXT-INDENT: -14.2pt; tab-stops: list 14.2pt left 322.5pt; mso-list: l0 level1 lfo1"><span style="font-family: Arial; mso-fareast-font-family: Arial;"><span style="mso-list: Ignore"><span style="font-size: small;">1.</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">实现</span><span style="font-family: Arial;">IAapter</span><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">接口。</span><span style="font-family: Arial;">IAapter</span><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">的接口定义如下：</span></span><span style="font-family: Arial;">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 14.2pt; TEXT-INDENT: -14.2pt; tab-stops: list 14.2pt left 322.5pt; mso-list: l0 level1 lfo1">&nbsp;</p>
<pre name="code" class="java">public interface IAdaptable {
	/**
	 * 根据传入的目标类型返回相应适配对象。
	 */
	public Object getAdapter(Class adapter);
}
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 14.2pt; TEXT-INDENT: -14.2pt; tab-stops: list 14.2pt left 322.5pt; mso-list: l0 level1 lfo1">&nbsp;</p>
</span></p>
<p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 14.2pt; TEXT-INDENT: -14.2pt; tab-stops: list 14.2pt left 322.5pt; mso-list: l0 level1 lfo1">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;"><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">参照&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">图</span><span style="font-size: 9pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">2</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">对象的适配器模式&rdquo;，</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">即</span><span style="font-size: 10.5pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Adaptee</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">对象还有一个上层接口</span><span style="font-size: 10.5pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">IAdaper</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">，在这种情况下，欲通&nbsp; 过</span><span style="font-size: 10.5pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">&nbsp;Adaptee</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">获得一个目标对象，可以通过调用</span><span style="font-size: 10.5pt; font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Adaptee</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的</span><span style="font-size: 10pt; color: #000000; font-family: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">getAdapter()</span><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">方法：</span></p>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;">&nbsp;</p>
<pre name="code" class="java">	public Object getAdapter(Class target) {
		if(target == ITarget.class){
			Adapter adapter = new Adapter(this);
			return adapter;
		}
		return super.getAdapter(target);
}
</pre>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;">&nbsp;</p>
<font face="宋体" style="mso-bidi-font-size: 10.5pt;">
<p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">通过这种查询获取的方式，客户端就不需要关注如何将对象适配以获得目标对象了。即：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; tab-stops: 322.5pt;"><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">在职责分配上，由被转换的对象来确定如何进行转换，也只有该对象知道如何转换，被转换对象使用了本身的资源来完成转换对象的创建。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 14.2pt; TEXT-INDENT: -14.2pt; tab-stops: list 14.2pt left 322.5pt; mso-list: l0 level1 lfo1"><span style="font-family: Arial; mso-fareast-font-family: Arial;"><span style="mso-list: Ignore"><span style="font-size: small;">2.</span><span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">为适配对象注册</span><span style="font-family: Arial;">IAdapterFactory</span><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">，</span><span style="font-family: Arial;"> <span lang="EN-US">IAdapterFactory</span></span><span style="font-family: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial;">的接口定义如下：</span></span></p>
</p>
</font></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="java">public interface IAdapterFactory {
	public Object getAdapter(Object adaptableObject, Class adapterType);
	/**
	 * @return 所有可以适配的类型。
	 */
	public Class[] getAdapterList();
}
</pre>
<p>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 322.5pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这种方式一般使用于对不能修改代码的现有对象进行适配。如</span><span lang="EN-US"><span style="font-family: Times New Roman;">eclipse</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">资源管理模型对象</span><span lang="EN-US"><span style="font-family: Times New Roman;">IFile</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">IResource</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，通过这种适配工厂方式，来完成向目标对象的转换。</span></span></p>
<p>客户端的调用方式如下:</p>
<p>&nbsp;</p>
<pre name="code" class="java">IAdapterManager manager = Platform.getAdapterManager();
IAdapterFactory factory = new FileAdapterFactory();
manager.registerAdapters(factory, IFile.class);
</pre>
<p>&nbsp;</p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="mso-list: Ignore"><span style="font-size: small; font-family: Arial;">3.</span><span style="font-size: x-small; font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp; </span></span>一个例子：利用</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">属性视图显示自己的属性。</span></p>
<p>&nbsp;<span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Eclipse</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的属性视图即</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">Properties View</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">可以用于显示当前所选元素的属性，在很多场合中，属性视图还同时提供属性编辑的功能。属性视图如何根据当前所选对象，获得显示的内容呢，参考</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">PropertySheetViewer</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的实现，可以发现</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">PropertySheetViewer</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">的显示模型对象为</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">IPropertySource</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">，从所选对象到</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体;">IPropertySource</span><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">装换的代码如下：</span></p>
<p>&nbsp;</p>
<pre name="code" class="java">protected IPropertySource getPropertySource(Object object) {
		if (sources.containsKey(object))
			return (IPropertySource) sources.get(object);
		IPropertySource result = null;
		IPropertySourceProvider provider = propertySourceProvider;
		if (provider == null &amp;&amp; object != null)
			provider = (IPropertySourceProvider) Platform.getAdapterManager()
					.getAdapter(object, IPropertySourceProvider.class);

		if (provider != null) {
			result = provider.getPropertySource(object);
		} else if (object instanceof IPropertySource) {
			result = (IPropertySource) object;
		} else if (object instanceof IAdaptable) {
			result = (IPropertySource) ((IAdaptable) object)
					.getAdapter(IPropertySource.class);
		} else {
			if (object != null)
				result = (IPropertySource) Platform.getAdapterManager()
						.getAdapter(object, IPropertySource.class);
		}

		sources.put(object, result);
		return result;
	}
</pre>
<p>&nbsp;</p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;"><span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">可以看出，这就是适配器模式在Eclipse使用的一个场景。</span>&nbsp;我们在定制自己的属性视图的时候，只要将自己的模型提供IPropertySource 的适配，提供属性视图就可以了。</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://tjlvan.javaeye.com/blog/230075#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Aug 2008 11:08:28 +0800</pubDate>
        <link>http://tjlvan.javaeye.com/blog/230075</link>
        <guid>http://tjlvan.javaeye.com/blog/230075</guid>
      </item>
      <item>
        <title>在不打开GEF编辑器的情况下，将Editor导出为图片</title>
        <author>tjlvan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tjlvan.javaeye.com">tjlvan</a>&nbsp;
          链接：<a href="http://tjlvan.javaeye.com/blog/226627" style="color:red;">http://tjlvan.javaeye.com/blog/226627</a>&nbsp;
          发表时间: 2008年08月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>从一个IFigure导出图片调用如下接口：</p>
<pre name="code" class="java">/**
 * Returns the bytes of an encoded image for the specified
 * IFigure in the specified format.
 *
 * @param figure the Figure to create an image for.
 * @param format one of SWT.IMAGE_BMP, SWT.IMAGE_BMP_RLE,SWT.IMAGE_GIF
 *          SWT.IMAGE_ICO, SWT.IMAGE_JPEG, or SWT.IMAGE_PNG
 * @return the bytes of an encoded image for the specified Figure
 */
private byte[] createImage(IFigure figure, int format) {
    Device device = getEditPartViewer().getControl().getDisplay();
    Rectangle r = figure.getBounds();
    ByteArrayOutputStream result = new ByteArrayOutputStream();
    Image image = null;
    GC gc = null;
    Graphics g = null;
    try {
        image = new Image(device, r.width, r.height);
        gc = new GC(image);
        g = new SWTGraphics(gc);
        g.translate(r.x * -1, r.y * -1);
        figure.paint(g);
        ImageLoader imageLoader = new ImageLoader();
        imageLoader.data = new ImageData[] {image.getImageData()};
        imageLoader.save(result, format);
    } finally {
        if (g != null) {
            g.dispose();
        }
        if (gc != null) {
            gc.dispose();
        }
        if (image != null) {
            image.dispose();
        }
    }
    return result.toByteArray();
}</pre>
<p>&nbsp;</p>
<p>传入的Figure一般对应到GraphicalViewer获得PRINTABLE_LAYERS(包括所有连线和图元)，如何在不打开编辑器的情况下拿到IFigure这个对象呢?</p>
<pre name="code" class="java">Shell shell =  new Shell();
// 创建画布
GraphicalViewer  viewer = new ScrollingGraphicalViewer();
viewer.createControl(shell);
// 最底层的EditPart，会生成含多个图层的Figure
viewer.setRootEditPart(new ScalableFreeformRootEditPart());
// 传入EditPartFactory
viewer.setEditPartFactory(editPartfacoty);
// 传入容器模型，包含所有图元和连线
viewer.setContents(obj);
// 强制刷新，在内存里生成所有的图元和连线
viewer.flush();
// 获取打印层
LayerManager layers = (LayerManager) viewer.getEditPartRegistry().get(LayerManager.ID);
IFigure figure  = layers.getLayer(LayerConstants.PRINTABLE_LAYERS);
// 调用导出图片的接口
...</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://tjlvan.javaeye.com/blog/226627#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Aug 2008 15:17:20 +0800</pubDate>
        <link>http://tjlvan.javaeye.com/blog/226627</link>
        <guid>http://tjlvan.javaeye.com/blog/226627</guid>
      </item>
      <item>
        <title>用JSP+Servlet+JDBC实现的一个留言本</title>
        <author>tjlvan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tjlvan.javaeye.com">tjlvan</a>&nbsp;
          链接：<a href="http://tjlvan.javaeye.com/blog/226550" style="color:red;">http://tjlvan.javaeye.com/blog/226550</a>&nbsp;
          发表时间: 2008年08月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一直在做插件开发，以前刚毕业时候做的一些Web开发的知识都快忘记了。<br />写了一个留言板的程序，重温一下以前的知识。<br />servlet控制跳转。<br />dao封装数据库的操作。
          <br/><br/>
          <span style="color:red;">
            <a href="http://tjlvan.javaeye.com/blog/226550#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Aug 2008 12:01:21 +0800</pubDate>
        <link>http://tjlvan.javaeye.com/blog/226550</link>
        <guid>http://tjlvan.javaeye.com/blog/226550</guid>
      </item>
  </channel>
</rss>