Android_原型模式_项目应用

来源:互联网 发布:oc js调用支付宝app 编辑:程序博客网 时间:2024/05/21 14:43

引入概念:
原型模式:实例通过copy创建新的对象,有浅copy和深copy.

项目中,由于menu中的对象,被popupwindow引用,popupwindow的点击事件又会对,对象属性进行修改,

解决办法就是,创建临时的新对象给 popupwindow用,
于是产生了下面很不优雅的代码,

NavMenuDetailEntity temp = new NavMenuDetailEntity();                    temp.setNavMenuDetailTitle(forGetUI.getNavMenuDetailTitle());         temp.setNavMenuDetailDesc(forGetUI.getNavMenuDetailDesc());                    temp.setNavMenuDetailList(forGetUI.getNavMenuDetailList());                    temp.setNavMenuDetailIcon(forGetUI.getNavMenuDetailIcon());                    temp.setNavMenuDetailColor(forGetUI.getNavMenuDetailColor());                    temp.setNavMenuDetaType(forGetUI.getNavMenuDetaType());

这样写确实可以,clone出来一个一样属性的对象,但是那一堆get xx
set xx 也太不软件工程了,感谢群里木木,nil 武汉的建议 原型模式的应用不就自然的解决这种对象的clone问题了.

于是我们开始着手打造第一个原型模式的entity 在Android项目中的使用,虽然很简单

  1. 我们的entity实现了,Cloneable 从写 clone方法,
  2. 这里直接上代码` @Override
    public NavMenuDetailEntity clone() {
    try {
    NavMenuDetailEntity cloneEntity = (NavMenuDetailEntity) super.clone();
    cloneEntity.navMenuDetailTitle = this.navMenuDetailTitle;
    cloneEntity.navMenuDetailDesc = this.navMenuDetailDesc;
    cloneEntity.navMenuDetailIcon = this.navMenuDetailIcon;
    cloneEntity.navMenuDetailColor = this.navMenuDetailColor;
    cloneEntity.navMenuDetaType = this.navMenuDetaType;

        // if property is object,so need deep copy    cloneEntity.navMenuDetailList = (ArrayList<String>) this.navMenuDetailList.clone();    return cloneEntity;} catch (CloneNotSupportedException e) {    e.printStackTrace();    return null;}

    }

    3.我们在activity中的使用变的很简单了,不见了那些 get set
    而变成,
    // deep clone
    NavMenuDetailEntity temp = forGetUI.clone();`
    一句话就能克隆出来一个 属性值完全一样的新对象
    而且不见了那种修改temp 改变原始对象值的问题,
    java的基础知识,内存中,对象指针的引用,

所以我们避免写出这样的克隆代码

 /**                                                                     * 创建的新对象在内存中,指针指向了 原型,所以后续修改tempX                     * 原型的forgetUI都会变..                     */                    NavMenuDetailEntity tempX= forGetUI;

如图所示,这里写图片描述

当修改了temp的title为 ktv的时候,原型的title也跟着变了.

所以原型模式无非是解决克隆对象的不二之选,

最后上一张预览GIF,等demo完毕后就开源,

地图demo预览

1 0
原创粉丝点击