实验6:原型模式

实验6:原型模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解原型模式的动机,掌握该模式的结构;

2、能够利用原型模式解决实际问题。

 
   

 


[实验任务一]:向量的原型

用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。

实验要求:

1.画出对应的类图;

 

2.提交源代码(用C++完成);

C++

#include "stdafx.h"

using namespace std;

class AbstractVector

{

public:

virtual AbstractVector* Clone() const = 0;

virtual void showData() = 0;

public:

double* len;//向量长度'

double begin;

double end;

};

class vector:public AbstractVector{

public: vector(double beg, double en){

begin = beg;

end = en;

len = new double;

if (end >= begin)

*len = end - begin;

else

*len = begin - end;

}

vector(const vector& cp){

int cho=0;

begin = cp.begin;

end = cp.end;

cout << "深克隆输入1,浅克隆选择2" << endl;

cin >> cho;

if (cho == 1){

len = new double;

*len = *(cp.len);

}

else

len = cp.len;

}

void showData(){

cout << "向量的长度为" << *len<<endl;

}

AbstractVector* Clone() const{

return new vector(*this);

}

~vector(){

delete len;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

AbstractVector* p = new vector(0,10);

AbstractVector* p1 = p->Clone();

cout << "p的长度为"; p->showData();

cout << "p1的长度为"; p1->showData();

if (p->len == p1->len){

cout << "这是浅克隆" << endl;

cout << "p->len的地址为" << p->len << endl;

cout << "p1->len的地址为" << p1->len << endl;

}

else{

cout << "这是深克隆" << endl;

cout << "p->len的地址为" << p->len << endl;

cout << "p1->len的地址为" << p1->len << endl;

}

system("pause");

return 0;

}

Java

package prototypePattern;

import java.io.Serializable;

public class Attachment_2 implements Serializable {

 private String name;   

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

 public void download() {

     System.out.println("下载附件"+name);

 }

}

package prototypePattern;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.io.Serializable;

 public class WeeklyLog_2 implements Serializable{

    private Attachment_2 attachment;

    private String date;

    private String name;

    private String content;

    public Attachment_2 getAttachment() {

       return attachment;

    }

    public void setAttachment(Attachment_2 attachment) {

       this.attachment = attachment;

    }

    public String getDate() {

       return date;

    }

    public void setDate(String date) {

       this.date = date;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getContent() {

       return content;

    }

    public void setContent(String content) {

       this.content = content;

    }

    public WeeklyLog_2 deepclone() throws Exception {

       ByteArrayOutputStream bao = new ByteArrayOutputStream();

       ObjectOutputStream oos = new ObjectOutputStream(bao);

       oos.writeObject(this);

       ByteArrayInputStream bi = new ByteArrayInputStream(bao.toByteArray());

       ObjectInputStream ois = new ObjectInputStream(bi);

       return (WeeklyLog_2)ois.readObject();

    }

}

package prototypePattern;                                                                                  

                                                                                                          

public class Client_2 {                                                                                                                                                                                 

    public static void main(String[] args) {                                                              

       WeeklyLog_2 log_1,log_2=null;                                                                             

       log_1 = new WeeklyLog_2();                                                                

       Attachment_2 attachment = new Attachment_2();                                              

       log_1.setAttachment(attachment);                                                 

       try {

           log_2=log_1.deepclone();

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }                                                                     

       System.out.println("周报对象是否相同"+(log_1==log_2));                                                    

       System.out.println("附件对象是否相同"+(log_1.getAttachment()==log_2.getAttachment()));                    

    }                                                                                                      

}                                                                                                         

3.注意编程规范。

posted @ 2022-10-24 14:02  萧贾jzm  阅读(30)  评论(0编辑  收藏  举报
//歌单id