随笔-35  评论-97  文章-0  trackbacks-0

Eclipse中大量地使用IAdaptable来动态的进行类型转化,想来这个方法还是挺好的,如果不是,它怎么能成eclipse的核心呢。下面给出应用IAdaptable的一个简单例子。

下面给出实现:

具有转换类型能力的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;
    }

    
//显示模型数据,这里你可以用别的方式,甚至应用到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");
        
        
//将实体转换成模型
        Model model = (Model)user.getAdapter(Model.class);
        
assert(model!=null):" model should not be null !";
        View view 
= new View();
        view.setModel(model);
//注入模型
        view.viewModel();//显示
        
        
//把模型转换为实体
        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");
        
        
//将实体转换成模型
        model = (Model)address.getAdapter(Model.class);
        
assert(model!=null):" model should not be null !";
        view.setModel(model);
//注入模型
        view.viewModel();//显示
        
        
//把模型转换为实体
        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());
    }

}

 

输出结果:

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的理解。你可以将转换工作从实体中抽取出来,使结构更加清晰。你可以在这里下载例子代码

posted on 2007-05-21 13:18 三告习习 阅读(1865) 评论(10)  编辑  收藏 所属分类: DesignPattern

评论:
# re: Eclipse中IAdaptable 思想简单应用 2007-05-21 21:51 | lvyf
将复杂的关系变的简单了。。
能不能用具体的实际例子来说说好处体现在哪呢。。  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-05-22 17:29 | 阿南
好东西,可以大量复用代码了  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-05-22 23:54 | 热门单曲
在此
有才楼主 路顶下  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-05-24 16:13 | 三告习习
@lvyf
这个例子应该是挺具体的了,虽然简单。
eclipse在应用中没有这么简单,它还会用到AdapterManager等来管理这些适配器。这里只是把思想摆摆而已。
有时间再跟一下,将例子的功能扩大些  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 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;
}

这里可以看的出来,是个工厂模式!  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-06-26 20:51 | 山风小子
请教您一个问题:
getAddressAdapter和getUserAdapter为何不能改为下面这种写法呢,
是不是为了在修改model之后,同步entity和model的状态呢,
但一日不调用这两个方法之一,entity和model的状态就是不同步的 :(

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

return address;
}


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

return user;
}  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-06-28 11:24 | 三告习习
@山风小子
这里的确可以像你所说的这种情况,因为model的data就是你要转的类型。
但是更多的时候我们要的不仅仅是返回这个data对象,比如是另外的一个视角。
举个例子说吧,在eclipse中,我们都知道“导航视图”和“包视图”的视角是不一样的,但是,它们却对应着同一个模型,它们都是都是同一个模型的不同展现方式,这里就可以用模型来进行两个不同视图所需的信息了(不是模型本身,在我上面的例子中我却不是这样,可以说例子不是很恰当,呵呵)。  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-06-28 20:37 | 山风小子
@三告习习
十分感谢您的耐心回复,
有个不情之请,能够用代码的形式解释一下,谢谢 :)  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-06-29 09:37 | 三告习习
@山风小子
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来获取一个对象的监听器,有兴趣可以看看,还配合factory使用,内容也不多。eclipse的机制实在很好,可惜还没有时间抽得出来好好研究~~~~~~~~~  回复  更多评论
  
# re: Eclipse中IAdaptable 思想简单应用 2007-06-29 13:21 | 山风小子
@三告习习
我先研究研究,有什么不懂的还劳烦您指教,谢谢 :)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: