隨筆-35  評(píng)論-97  文章-0  trackbacks-0

          Eclipse中大量地使用IAdaptable來(lái)動(dòng)態(tài)的進(jìn)行類型轉(zhuǎn)化,想來(lái)這個(gè)方法還是挺好的,如果不是,它怎么能成eclipse的核心呢。下面給出應(yīng)用IAdaptable的一個(gè)簡(jiǎn)單例子。

          下面給出實(shí)現(xiàn):

          具有轉(zhuǎn)換類型能力的IAdaptable接口:

          public interface IAdaptable
          {
              
          public Object getAdapter(Class clazz);
          }

          實(shí)體User:

           

          public class User implements IAdaptable
          {
              
          private int id;
              
          private String name;
              
          private String sex;
              
          public int getId()
              
          {
                  
          return id;
              }

              
          public void setId(int id)
              
          {
                  
          this.id = id;
              }

              
          public String getName()
              
          {
                  
          return name;
              }

              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }

              
          public String getSex()
              
          {
                  
          return sex;
              }

              
          public void setSex(String sex)
              
          {
                  
          this.sex = sex;
              }

              
              
          public Object getAdapter(Class clazz)
              
          {
                  
          if(clazz==Model.class){
                      
          return getModelAdapter();
                  }

                  
          return null;
              }

              
              
          private Object getModelAdapter()
              
          {
                  Model model 
          = new Model();
                  model.addAttribute(
          "id", id);
                  model.addAttribute(
          "name", name);
                  model.addAttribute(
          "sex", sex);
                  model.setData(
          this);
                  
          return model;
              }

          }

           

          實(shí)體Address:

           

          public class Address implements IAdaptable
          {
              
          private int id;
              
          private String name;
              
          private String street;
              
          private String zipcode;
              
              
          public int getId()
              
          {
                  
          return id;
              }

              
          public void setId(int id)
              
          {
                  
          this.id = id;
              }

              
          public String getName()
              
          {
                  
          return name;
              }

              
          public void setName(String name)
              
          {
                  
          this.name = name;
              }

              
          public String getStreet()
              
          {
                  
          return street;
              }

              
          public void setStreet(String street)
              
          {
                  
          this.street = street;
              }

              
          public String getZipcode()
              
          {
                  
          return zipcode;
              }

              
          public void setZipcode(String zipcode)
              
          {
                  
          this.zipcode = zipcode;
              }

              
          public Object getAdapter(Class clazz)
              
          {
                  
          if(clazz==Model.class){
                      
          return getModelAdapter();
                  }

                  
          return null;
              }

              
              
          private Object getModelAdapter()
              
          {
                  Model model 
          = new Model();
                  model.addAttribute(
          "id", id);
                  model.addAttribute(
          "name", name);
                  model.addAttribute(
          "street", street);
                  model.addAttribute(
          "zipcode", zipcode);
                  model.setData(
          this);
                  
          return model;
              }

          }

           

          模型,兼容User和Address

           

          public class Model implements IAdaptable
          {
              
          private Map<String, Object> attributes;
              
          private Object data;
              
          public Model()
              
          {
                  attributes 
          = new HashMap<String, Object>();
              }

              
          public Object getAdapter(Class clazz)
              
          {
                  
          if(clazz==User.class){
                      
          return getUserAdapter();
                  }

                  
          if(clazz==Address.class){
                      
          return getAddressAdapter();
                  }

                  
          return null;
              }

              
              
          private Object getAddressAdapter()
              
          {
                  Address address 
          = (Address)data;
                  address.setId(Integer.parseInt(String.valueOf(
          this.getAttribute("id"))));
                  address.setName(String.valueOf(
          this.getAttribute("name")));
                  address.setStreet(String.valueOf(
          this.getAttribute("street")));
                  address.setZipcode(String.valueOf(
          this.getAttribute("zipcode")));
                  
          return address;
              }

              
          private Object getUserAdapter()
              
          {
                  User user 
          = (User)data;
                  user.setId(Integer.parseInt(String.valueOf(
          this.getAttribute("id"))));
                  user.setName(String.valueOf(
          this.getAttribute("name")));
                  user.setSex(String.valueOf(
          this.getAttribute("sex")));
                  
          return user;
              }

              
          public void addAttribute(String key,Object value){
                  attributes.put(key, value);
              }

              
          public Object getAttribute(String key){
                  
          return attributes.get(key);
              }

              
          public Map<String, Object> getAttributes()
              
          {
                  
          return attributes;
              }

              
              
          public Object getData()
              
          {
                  
          return data;
              }

              
          public void setData(Object data)
              
          {
                  
          this.data = data;
              }

          }

           

          視圖,將模型顯示:

          public class View
          {
              
          private Model model;
              
              
          public Model getModel()
              
          {
                  
          return model;
              }

              
          public void setModel(Model model)
              
          {
                  
          this.model = model;
              }

              
          //顯示模型數(shù)據(jù),這里你可以用別的方式,甚至應(yīng)用到web上
              public void viewModel(){
                  System.out.println(model.getData().getClass().getName());
                  Set
          <Entry<String, Object>> entry = model.getAttributes().entrySet();
                  
          for(Entry<String, Object> entry2 : entry)
                  
          {
                      System.out.println(entry2.getKey() 
          + " = " + entry2.getValue());
                  }

              }

          }

           

          跑一下:

          public class AdapterTest
          {
              
          public static void main(String[] args)
              
          {
                  User user 
          = new User();
                  user.setId(
          1001);
                  user.setName(
          "useraaa");
                  user.setSex(
          "M");
                  
                  
          //將實(shí)體轉(zhuǎn)換成模型
                  Model model = (Model)user.getAdapter(Model.class);
                  
          assert(model!=null):" model should not be null !";
                  View view 
          = new View();
                  view.setModel(model);
          //注入模型
                  view.viewModel();//顯示
                  
                  
          //把模型轉(zhuǎn)換為實(shí)體
                  User newUser = (User)model.getAdapter(User.class);
                  
          assert(newUser!=null):" entity should not be null !";
                  System.out.println(newUser.getId()
          + "  " + newUser.getName());
                  
                  Address address 
          = new Address();
                  address.setId(
          2002);
                  address.setName(
          "addressaaa");
                  address.setStreet(
          "street 1");
                  address.setZipcode(
          "5002");
                  
                  
          //將實(shí)體轉(zhuǎn)換成模型
                  model = (Model)address.getAdapter(Model.class);
                  
          assert(model!=null):" model should not be null !";
                  view.setModel(model);
          //注入模型
                  view.viewModel();//顯示
                  
                  
          //把模型轉(zhuǎn)換為實(shí)體
                  Address newAddress = (Address)model.getAdapter(Address.class);
                  
          assert(newAddress!=null):" entity should not be null !";
                  System.out.println(newAddress.getId()
          + "  " + newAddress.getName() + "   "+newAddress.getStreet() + "  "+ newAddress.getZipcode());
              }

          }

           

          輸出結(jié)果:

          adapter.entity.User
          sex = M
          name = useraaa
          id = 1001
          1001  useraaa
          adapter.entity.Address
          street = street 1
          name = addressaaa
          zipcode = 5002
          id = 2002
          2002  addressaaa   street 1  5002

           

          這里為了簡(jiǎn)單化,省去控制層,但這并不妨礙對(duì)IAdaptable的理解。你可以將轉(zhuǎn)換工作從實(shí)體中抽取出來(lái),使結(jié)構(gòu)更加清晰。你可以在這里下載例子代碼

          posted on 2007-05-21 13:18 三告習(xí)習(xí) 閱讀(1880) 評(píng)論(10)  編輯  收藏 所屬分類: DesignPattern

          評(píng)論:
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-05-21 21:51 | lvyf
          將復(fù)雜的關(guān)系變的簡(jiǎn)單了。。
          能不能用具體的實(shí)際例子來(lái)說(shuō)說(shuō)好處體現(xiàn)在哪呢。。  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-05-22 17:29 | 阿南
          好東西,可以大量復(fù)用代碼了  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-05-22 23:54 | 熱門(mén)單曲
          在此
          有才樓主 路頂下  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-05-24 16:13 | 三告習(xí)習(xí)
          @lvyf
          這個(gè)例子應(yīng)該是挺具體的了,雖然簡(jiǎn)單。
          eclipse在應(yīng)用中沒(méi)有這么簡(jiǎn)單,它還會(huì)用到AdapterManager等來(lái)管理這些適配器。這里只是把思想擺擺而已。
          有時(shí)間再跟一下,將例子的功能擴(kuò)大些  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-08 12:45 | helloboy
          public class Model implements IAdaptable
          {
          .
          .
          .
          public Object getAdapter(Class clazz)
          {
          if(clazz==User.class){
          return getUserAdapter();
          }
          if(clazz==Address.class){
          return getAddressAdapter();
          }
          return null;
          }

          這里可以看的出來(lái),是個(gè)工廠模式!  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-26 20:51 | 山風(fēng)小子
          請(qǐng)教您一個(gè)問(wèn)題:
          getAddressAdapter和getUserAdapter為何不能改為下面這種寫(xiě)法呢,
          是不是為了在修改model之后,同步entity和model的狀態(tài)呢,
          但一日不調(diào)用這兩個(gè)方法之一,entity和model的狀態(tài)就是不同步的 :(

          private Object getAddressAdapter()
          {
          Address address = (Address)data;

          return address;
          }


          private Object getUserAdapter()
          {
          User user = (User)data;

          return user;
          }  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-28 11:24 | 三告習(xí)習(xí)
          @山風(fēng)小子
          這里的確可以像你所說(shuō)的這種情況,因?yàn)閙odel的data就是你要轉(zhuǎn)的類型。
          但是更多的時(shí)候我們要的不僅僅是返回這個(gè)data對(duì)象,比如是另外的一個(gè)視角。
          舉個(gè)例子說(shuō)吧,在eclipse中,我們都知道“導(dǎo)航視圖”和“包視圖”的視角是不一樣的,但是,它們卻對(duì)應(yīng)著同一個(gè)模型,它們都是都是同一個(gè)模型的不同展現(xiàn)方式,這里就可以用模型來(lái)進(jìn)行兩個(gè)不同視圖所需的信息了(不是模型本身,在我上面的例子中我卻不是這樣,可以說(shuō)例子不是很恰當(dāng),呵呵)。  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-28 20:37 | 山風(fēng)小子
          @三告習(xí)習(xí)
          十分感謝您的耐心回復(fù),
          有個(gè)不情之請(qǐng),能夠用代碼的形式解釋一下,謝謝 :)  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-29 09:37 | 三告習(xí)習(xí)
          @山風(fēng)小子
          public class Model implements IAdaptable
          {
          private Object data;
          public Model()
          {
          }
          public Object getAdapter(Class clazz)
          {
          if(clazz==UserViewInfo.class){
          return getUserViewInfoAdapter();
          }
          if(clazz==AddressViewInfo.class){
          return getAddressViewInfoAdapter();
          }
          return null;
          }

          private Object getAddressViewInfoAdapter()
          {
          if(data instanceof Address){
          Address address = (Address)data;
          AddressViewInfo info = new AddressViewInfo();
          info.setData(address);
          Image icon = new Image(getAddressIcon());
          //...其他
          return info;
          }
          return null;
          }
          private Object getUserViewInfoAdapter()
          {
          if(data instanceof User){
          User user = (User)data;
          UserViewInfo info = new UserViewInfo();
          info.setData(user);
          Image icon = new Image(getUserIcon());
          //...其他
          return info;
          }
          return null;
          }

          public Object getData()
          {
          return data;
          }
          public void setData(Object data)
          {
          this.data = data;
          }
          }

          eclipse在emf上使用adapter來(lái)獲取一個(gè)對(duì)象的監(jiān)聽(tīng)器,有興趣可以看看,還配合factory使用,內(nèi)容也不多。eclipse的機(jī)制實(shí)在很好,可惜還沒(méi)有時(shí)間抽得出來(lái)好好研究~~~~~~~~~  回復(fù)  更多評(píng)論
            
          # re: Eclipse中IAdaptable 思想簡(jiǎn)單應(yīng)用 2007-06-29 13:21 | 山風(fēng)小子
          @三告習(xí)習(xí)
          我先研究研究,有什么不懂的還勞煩您指教,謝謝 :)  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 栾城县| 若羌县| 营口市| 龙口市| 宝兴县| 大同县| 新民市| 汨罗市| 昆明市| 黄石市| 胶州市| 望奎县| 无极县| 县级市| 綦江县| 徐州市| 井陉县| 潮州市| 手游| 迭部县| 厦门市| 南皮县| 浦县| 凤翔县| 乐清市| 新化县| 鹤庆县| 区。| 顺义区| 辉南县| 阿鲁科尔沁旗| 乌兰县| 达尔| 容城县| 屏东县| 锦屏县| 中江县| 光泽县| 宁晋县| 仪陇县| 利津县|