设为首页 加入收藏

TOP

悟空模式-java-原型模式(四)
2017-10-10 12:31:26 】 浏览:7785
Tags:悟空 模式 -java- 原型
序列恢复为原来的对象,我们可以利用这一功能来实现轻量级的深复制,但前提是需要复制对象实现Serializable接口。

序列化深复制原型模式

悟空

package com.tirion.design.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class WuKong implements Serializable {

    private GoldenCudgel goldenCudgel;

    public GoldenCudgel getGoldenCudgel() {
        return goldenCudgel;
    }

    public void setGoldenCudgel(GoldenCudgel goldenCudgel) {
        this.goldenCudgel = goldenCudgel;
    }

    public WuKong() {
        goldenCudgel = new GoldenCudgel(false);
    }

    public WuKong deepClone() throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        return (WuKong) ois.readObject();
    }

    public static void main(String[] args) throws Exception {
        WuKong wuKong = new WuKong();
        WuKong wuKongDeepCopy = wuKong.deepClone();
        System.out.println("深复制后悟空是否为同一个对象" + (wuKong == wuKongDeepCopy));
        System.out.println("深复制后金箍棒是否为同一个对象" + (wuKong.getGoldenCudgel() == wuKongDeepCopy.getGoldenCudgel()));
        System.out.println("深复制原对象金箍棒属性为" + wuKong.getGoldenCudgel().isDisappear());
        System.out.println("深复制对象金箍棒属性发生改变...");
        wuKongDeepCopy.getGoldenCudgel().setDisappear(true);
        System.out.println("深复制原对象金箍棒属性为" + wuKong.getGoldenCudgel().isDisappear());
    }

}

这时候运行main()方法会报java.io.NotSerializableException,因为序列化对象要求引用对象也必须实现Serializable接口,除非对应属性不需要序列化,所以我们这里需要将金箍棒类也实现序列化接口。

金箍棒

package com.tirion.design.prototype;

import java.io.Serializable;

public class GoldenCudgel implements Serializable {

    public GoldenCudgel() {

    }

    public GoldenCudgel(boolean disappear) {
        this.disappear = disappear;
    }

    private boolean disappear;

    public boolean isDisappear() {
        return disappear;
    }

    public void setDisappear(boolean disappear) {
        this.disappear = disappear;
    }

    public boolean equals(GoldenCudgel obj) {
        return obj.isDisappear() == disappear;
    }

}

执行结果

深复制后悟空是否为同一个对象false
深复制后金箍棒是否为同一个对象false
深复制原对象金箍棒属性为false
深复制对象金箍棒属性发生改变...
深复制原对象金箍棒属性为false

从结果来看,通过序列化实现深复制与通过clone()方法实现深复制的结果是一样的,但是方法却比较简单,我们只需要将需要复制的对象实现序列化接口就可以了。同时java的对象序列化是提供了轻量级持久化的,我们可以通过网络或者磁盘来进行数据的传播及持久化,并且就突破了clone()方法只能本地程序运行期间才能持久化的限制。

关于原型模式的介绍就到这里,你可以将它记忆为身外身模式

如果你认为文章中哪里有错误或者不足的地方,欢迎在评论区指出,也希望这篇文章对你学习java设计模式能够有所帮助。转载请注明,谢谢。

更多设计模式的介绍请到悟空模式-java设计模式中查看。

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇简易RPC框架-过滤器机制 下一篇设计模式精要

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目