• 设计模式~原始模型模式(二)


    这里给出一个原始模型模式的例子。孙大圣的身外身法术

    浅复制

    设计图如下:

     TheGreatestSage类扮演客户角色。

    TheGreatestSage类

    package com.vincent.prototype;
    
    public class TheGreatestSage {
    
        private Monkey monkey = new Monkey();
        public void change(){
            Monkey copyMonkey;
            for(int i=0;i<2000;i++){};
            copyMonkey = (Monkey)monkey.clone();
            System.out.println("Monkey King's birth date="+monkey.getBirthDate());
            System.out.println("Copy monkey's birth date="+copyMonkey.getBirthDate());
            System.out.println("Monkey King == Copy Monkey?"+(monkey==copyMonkey));
            System.out.println("Monkey King's Staff==Copy Monkey's Staff?"+(monkey.getStaff()==copyMonkey.getStaff()));
            
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            TheGreatestSage sage = new TheGreatestSage();
            sage.change();
            
        }
    
    }

    Monkey类

    package com.vincent.prototype;
    
    import java.util.Date;
    
    public class Monkey implements Cloneable {
    
        private int height;
        private int weight;
        private GoldRingedStaff staff;
        private Date birthDate;
        
        /**
         * 构造函数
         */
        public Monkey(){
            this.birthDate = new Date();
        }
        
        public Object clone(){
            Monkey temp = null;
            try{
                temp = (Monkey)super.clone();
            }catch(CloneNotSupportedException e){
                System.out.println("Clone failed");
            }finally{
                return temp;
            }
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public Date getBirthDate() {
            return birthDate;
        }
    
        public void setBirthDate(Date birthDate) {
            this.birthDate = birthDate;
        }
    
        public GoldRingedStaff getStaff() {
            return staff;
        }
    
        public void setStaff(GoldRingedStaff staff) {
            this.staff = staff;
        }
        
    }

    GoldRingedStaff类

    package com.vincent.prototype;
    
    public class GoldRingedStaff {
    
        private float height = 100.F;
        private float diameter = 10.F;
        
        /**
         * 构造函数
         */
        public GoldRingedStaff(){
            // write your code here
        }
        /**
         * 增长行为
         */
        public void grow(){
            this.diameter *=2.0;
            this.height *=2.0;
        }
        /**
         * 缩小行为
         */
        public void shrink(){
            this.diameter /= 2;
            this.height /= 2;
        }
        
        public void move(){
            //wirte you code for moving the staff
        }
        public float getHeight() {
            return height;
        }
        public void setHeight(float height) {
            this.height = height;
        }
        public float getDiameter() {
            return diameter;
        }
        public void setDiameter(float diameter) {
            this.diameter = diameter;
        }
        
    }

    运行结果如下:

    Monkey King's birth date=Fri Aug 14 07:15:59 CST 2020
    Copy monkey's birth date=Fri Aug 14 07:15:59 CST 2020
    Monkey King == Copy Monkey?false
    Monkey King's Staff==Copy Monkey's Staff?true

    深复制

    为做到深复制,所有需要复制的对象需要实现 java.io.Serializable接口。

    系统设计如下:

     TheGreatestSage类

    package com.vincent.prototype;
    
    import java.io.IOException;
    
    public class TheGreatestSage {
    
        private Monkey monkey = new Monkey();
        public void change() throws IOException,ClassNotFoundException{
            Monkey copyMonkey;
            for(int i=0;i<2000;i++){};
            copyMonkey = (Monkey)monkey.deepClone();
            System.out.println("Monkey King's birth date="+monkey.getBirthDate());
            System.out.println("Copy monkey's birth date="+copyMonkey.getBirthDate());
            System.out.println("Monkey King == Copy Monkey?"+(monkey==copyMonkey));
            System.out.println("Monkey King's Staff==Copy Monkey's Staff?"+(monkey.getStaff()==copyMonkey.getStaff()));
            
        }
        
        public static void main(String[] args) throws IOException,ClassNotFoundException{
            // TODO Auto-generated method stub
    
            TheGreatestSage sage = new TheGreatestSage();
            sage.change();
            
        }
    
    }

    Monkey 

    package com.vincent.prototype;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OptionalDataException;
    import java.io.Serializable;
    import java.util.Date;
    
    public class Monkey implements Cloneable,Serializable {
    
        private int height;
        private int weight;
        private GoldRingedStaff staff;
        private Date birthDate;
        
        /**
         * 构造函数
         */
        public Monkey(){
            this.birthDate = new Date();
            this.staff = new GoldRingedStaff();
        }
        /**
         * 深克隆方法
         * @return
         * @throws IOException
         * @throws OptionalDataException
         * @throws ClassNotFoundException
         */
        public Object deepClone() throws IOException,OptionalDataException,ClassNotFoundException
        {
            //首先将对象写出到流里
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(this);
            //然后将对象从流里读出来
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi = new ObjectInputStream(bi);
            
            return (oi.readObject());
        }
        /**
         * 浅克隆方法
         */
        public Object clone(){
            Monkey temp = null;
            try{
                temp = (Monkey)super.clone();
            }catch(CloneNotSupportedException e){
                System.out.println("Clone failed");
            }finally{
                return temp;
            }
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public Date getBirthDate() {
            return birthDate;
        }
    
        public void setBirthDate(Date birthDate) {
            this.birthDate = birthDate;
        }
    
        public GoldRingedStaff getStaff() {
            return staff;
        }
    
        public void setStaff(GoldRingedStaff staff) {
            this.staff = staff;
        }
        
    }

    GoldRingedStaff

    package com.vincent.prototype;
    
    import java.io.Serializable;
    
    public class GoldRingedStaff implements Cloneable,Serializable{
    
        private float height = 100.F;
        private float diameter = 10.F;
        
        /**
         * 构造函数
         */
        public GoldRingedStaff(){
            // write your code here
        }
        /**
         * 增长行为
         */
        public void grow(){
            this.diameter *=2.0;
            this.height *=2.0;
        }
        /**
         * 缩小行为
         */
        public void shrink(){
            this.diameter /= 2;
            this.height /= 2;
        }
        
        public void move(){
            //wirte you code for moving the staff
        }
        public float getHeight() {
            return height;
        }
        public void setHeight(float height) {
            this.height = height;
        }
        public float getDiameter() {
            return diameter;
        }
        public void setDiameter(float diameter) {
            this.diameter = diameter;
        }
        
    }

    结果如下:

    Monkey King's birth date=Fri Aug 14 07:37:04 CST 2020
    Copy monkey's birth date=Fri Aug 14 07:37:04 CST 2020
    Monkey King == Copy Monkey?false
    Monkey King's Staff==Copy Monkey's Staff?false

  • 相关阅读:
    javaEE web 系统安装时自定义初始化
    windows 安装绿色版mysql
    myeclipse 安装svn(subeclipsesite)插件
    Xcode连接 Git
    生成16位不重复编码
    百度工程师也犯低级错误(有心还是无意)?
    IBatis 映射文件 sql 中大于、小于等符号转义
    web项目文档总览
    银行卡号的校验
    身份证的校验
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/13500078.html
Copyright © 2020-2023  润新知