隨筆-35  評論-97  文章-0  trackbacks-0

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

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

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

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

          實體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;
              }

          }

           

          實體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");
                  
                  
          //將實體轉(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)換為實體
                  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");
                  
                  
          //將實體轉(zhuǎn)換成模型
                  model = (Model)address.getAdapter(Model.class);
                  
          assert(model!=null):" model should not be null !";
                  view.setModel(model);
          //注入模型
                  view.viewModel();//顯示
                  
                  
          //把模型轉(zhuǎn)換為實體
                  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

           

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

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

          評論:
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-05-21 21:51 | lvyf
          將復(fù)雜的關(guān)系變的簡單了。。
          能不能用具體的實際例子來說說好處體現(xiàn)在哪呢。。  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-05-22 17:29 | 阿南
          好東西,可以大量復(fù)用代碼了  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-05-22 23:54 | 熱門單曲
          在此
          有才樓主 路頂下  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-05-24 16:13 | 三告習(xí)習(xí)
          @lvyf
          這個例子應(yīng)該是挺具體的了,雖然簡單。
          eclipse在應(yīng)用中沒有這么簡單,它還會用到AdapterManager等來管理這些適配器。這里只是把思想擺擺而已。
          有時間再跟一下,將例子的功能擴大些  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(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;
          }

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

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

          return address;
          }


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

          return user;
          }  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-06-28 11:24 | 三告習(xí)習(xí)
          @山風(fēng)小子
          這里的確可以像你所說的這種情況,因為model的data就是你要轉(zhuǎn)的類型。
          但是更多的時候我們要的不僅僅是返回這個data對象,比如是另外的一個視角。
          舉個例子說吧,在eclipse中,我們都知道“導(dǎo)航視圖”和“包視圖”的視角是不一樣的,但是,它們卻對應(yīng)著同一個模型,它們都是都是同一個模型的不同展現(xiàn)方式,這里就可以用模型來進(jìn)行兩個不同視圖所需的信息了(不是模型本身,在我上面的例子中我卻不是這樣,可以說例子不是很恰當(dāng),呵呵)。  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-06-28 20:37 | 山風(fēng)小子
          @三告習(xí)習(xí)
          十分感謝您的耐心回復(fù),
          有個不情之請,能夠用代碼的形式解釋一下,謝謝 :)  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(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來獲取一個對象的監(jiān)聽器,有興趣可以看看,還配合factory使用,內(nèi)容也不多。eclipse的機制實在很好,可惜還沒有時間抽得出來好好研究~~~~~~~~~  回復(fù)  更多評論
            
          # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-06-29 13:21 | 山風(fēng)小子
          @三告習(xí)習(xí)
          我先研究研究,有什么不懂的還勞煩您指教,謝謝 :)  回復(fù)  更多評論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新泰市| 淮南市| 博罗县| 常德市| 旅游| 呼伦贝尔市| 清镇市| 景谷| 阳原县| 左权县| 丰县| 酉阳| 聂拉木县| 会理县| 泸溪县| 鄂托克旗| 北川| 光泽县| 望都县| 商水县| 林西县| 铜梁县| 昔阳县| 高唐县| 彝良县| 莲花县| 陕西省| 沂南县| 涿鹿县| 南木林县| 马鞍山市| 云龙县| 深水埗区| 陈巴尔虎旗| 四川省| 宜州市| 广汉市| 南澳县| 珠海市| 遂川县| 抚顺县|