<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


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

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

    下面給出實(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

     

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

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

    評論:
    # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-05-21 21:51 | lvyf
    將復(fù)雜的關(guān)系變的簡單了。。
    能不能用具體的實(shí)際例子來說說好處體現(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等來管理這些適配器。這里只是把思想擺擺而已。
    有時間再跟一下,將例子的功能擴(kuò)大些  回復(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)小子
    這里的確可以像你所說的這種情況,因?yàn)閙odel的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的機(jī)制實(shí)在很好,可惜還沒有時間抽得出來好好研究~~~~~~~~~  回復(fù)  更多評論
      
    # re: Eclipse中IAdaptable 思想簡單應(yīng)用 2007-06-29 13:21 | 山風(fēng)小子
    @三告習(xí)習(xí)
    我先研究研究,有什么不懂的還勞煩您指教,謝謝 :)  回復(fù)  更多評論
      

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产成人无码免费网站| 亚洲成av人片在线看片| 亚洲免费日韩无码系列| 国产一级高青免费| 8090在线观看免费观看| 免费可以看黄的视频s色| 成a人片亚洲日本久久| 亚洲欧洲日韩国产综合在线二区| 国产麻豆成人传媒免费观看| 久热免费在线视频| 成人最新午夜免费视频| 2022中文字字幕久亚洲| 亚洲精品偷拍无码不卡av| 免费国产在线观看老王影院| 激情97综合亚洲色婷婷五| 亚洲国产精品综合久久2007| 污视频网站在线免费看| 亚洲中文字幕无码爆乳| 大地影院MV在线观看视频免费 | 中文字幕乱码亚洲无线三区 | 免费国产高清视频| 67194熟妇在线永久免费观看| 免费国产成人18在线观看| 韩国免费三片在线视频| 亚洲日韩乱码中文无码蜜桃臀| 夜夜春亚洲嫩草影院| 亚洲日韩国产欧美一区二区三区 | 亚洲A∨午夜成人片精品网站| 中文字幕人成人乱码亚洲电影| 成人永久免费高清| 亚洲欧洲中文日产| 69国产精品视频免费| 亚洲精品高清国产一线久久| 久久丫精品国产亚洲av不卡| 免费人人潮人人爽一区二区| 美女黄频免费网站| 人人鲁免费播放视频人人香蕉| 免费大片av手机看片高清| 又大又黄又粗又爽的免费视频| 亚洲免费在线观看| 亚洲无线一二三四区手机|