設計模式練習(5)——原型模式

原型模式

一、題目:

某數據處理軟件需要增加一個圖表複製功能。在圖表對象(DataChart)中包含一個數據集對象(DataSet)。數據集對象用於封裝要顯示的數據,用戶可以通過界面上的複製按鈕將該圖表複製一份,複製後,即可得到新的圖表對象,然後可以修改新圖表的編號、顏色、數據。試用原型模式設計軟件實現深克隆。
(1)給出原型模式等結構視圖
(2)給出該實例等類圖及代碼實現

二、所用模式結構視圖:

這裏寫圖片描述

三、實例類圖:

這裏寫圖片描述

四、實例實現代碼:

(因爲區分,所以在類的前面加了Gj19)

圖表對象Gj19DataChart:

package 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;

/**
 * 圖表對象
 * @author gong
 *
 */
public class Gj19DataChart implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 3672368913840301016L;
    private DataSet ds = new DataSet(); 
    public int number;  //編號
    public String color;   //顏色
    public int data;   //數據
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }

    public DataSet getDs() {
        return ds;
    }
    public void setDs(DataSet ds) {
        this.ds = ds;
    }
    @Override
    public String toString() {
        return "Gj19DataChart [number=" + number + ", color=" + color
                + ", data=" + data + "]";
    }
    //使用序列化技術實現深克隆
    public Gj19DataChart deepClone() throws  IOException, ClassNotFoundException, OptionalDataException
    {
           //將對象寫入流中
           ByteArrayOutputStream bao=new  ByteArrayOutputStream();
           ObjectOutputStream oos=new  ObjectOutputStream(bao);
           oos.writeObject(this);

           //將對象從流中取出
           ByteArrayInputStream bis=new  ByteArrayInputStream(bao.toByteArray());
           ObjectInputStream ois=new  ObjectInputStream(bis);
           return  (Gj19DataChart)ois.readObject();
    }
}

DateSet數據流對象:

package Prototype;

import java.io.Serializable;
/**
 * DateSet數據流對象
 * @author gong
 *
 */
public class DataSet implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -4833027480140156492L;
    public int number;  //編號
    public String color;   //顏色
    public int data;   //數據
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }

}

客戶端測試原型模式:

package Prototype;
//測試原型模式
public class Client {
     public  static void main(String args[])
        {
            Gj19DataChart  datachart1, datachart2 = null;
            datachart1  = new Gj19DataChart(); //創建原型對象
            try
            {
                datachart2 =  datachart1.deepClone(); //調用深克隆方法創建克隆對象                  
            }
            catch(Exception e){
                   System.out.println("克隆失敗!");
            }
           System.out.println(datachart1==datachart2);
           System.out.println(datachart1.getDs()==datachart2.getDs());
           System.out.println(datachart1.getColor()==datachart2.getColor());
     }
}

五、運行結果:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章