设计模式十二.docx
- 文档编号:10101815
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:18
- 大小:17.98KB
设计模式十二.docx
《设计模式十二.docx》由会员分享,可在线阅读,更多相关《设计模式十二.docx(18页珍藏版)》请在冰豆网上搜索。
设计模式十二
一.实验目的
1.熟悉UML统一建模语言;
2.回顾熟悉建造模式、原型模式;
3.熟悉XML文件的操作;
4.熟悉java的反射机制。
二.实验内容
(1)某软件公司欲开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。
在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。
现使用建造者模式设计该软件。
(2)设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。
三.实验环境
PC微机;
Windows操作系统;
VisualStudio程序集成环境。
四.实验内容
(1)某软件公司欲开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。
在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。
现使用建造者模式设计该软件。
ModelBuilder.java
package设计模式实验十二周_1;
publicabstractclassModelBuilder{
protectedModelmodel=newModel();
publicabstractvoidbuildPlay();
publicabstractvoidbuildMenu();
publicabstractvoidbuildPlaylist();
publicabstractvoidbuildMainWindow();
publicabstractvoidbuildControlbar();
publicModelgetModel(){
returnmodel;
}
}
Diector.java
package设计模式实验十二周_1;
publicclassDiector{
privateModelBuildermb;
publicvoidsetModelBuilder(ModelBuildermb){
this.mb=mb;
}
publicModelconstruct(){
mb.buildPlay();
mb.buildMenu();
mb.buildPlaylist();
mb.buildMainWindow();
mb.buildControlbar();
returnmb.getModel();
}
}
Model.java
package设计模式实验十二周_1;
publicclassModel{
privateStringplay;
privateStringmenu;
privateStringplaylist;
privateStringmainWindow;
privateStringcontrolbar;
publicvoidsetPlay(Stringplay){
this.play=play;
}
publicvoidsetMenu(Stringmenu){
this.menu=menu;
}
publicvoidsetPlaylist(Stringplaylist){
this.playlist=playlist;
}
publicvoidsetMainWindow(StringmainWindow){
this.mainWindow=mainWindow;
}
publicvoidsetControlbar(Stringcontrolbar){
this.controlbar=controlbar;
}
publicStringgetPlay(){
return(this.play);
}
publicStringgetMenu(){
return(this.menu);
}
publicStringgetPlaylist(){
return(this.playlist);
}
publicStringgetMainWindow(){
return(this.mainWindow);
}
publicStringgetControlbar(){
return(this.controlbar);
}
}
CompleteModelBuilder.java
package设计模式实验十二周_1;
publicclassCompleteModelBuilderextendsModelBuilder{
publicvoidbuildPlay(){
model.setPlay("完整模式:
");
}
publicvoidbuildMenu(){
model.setMenu("显示菜单");
}
publicvoidbuildPlaylist(){
model.setPlaylist("显示播放列表");
}
publicvoidbuildMainWindow(){
model.setMainWindow("显示主窗口");
}
publicvoidbuildControlbar(){
model.setControlbar("显示控制条");
}
}
MemoryModelBuilder.java
package设计模式实验十二周_1;
publicclassMemoryModelBuilderextendsModelBuilder{
publicvoidbuildPlay(){
model.setPlay("记忆模式:
");
}
publicvoidbuildMenu(){
model.setMenu("不显示菜单");
}
publicvoidbuildPlaylist(){
model.setPlaylist("显示播放列表");
}
publicvoidbuildMainWindow(){
model.setMainWindow("显示主窗口");
}
publicvoidbuildControlbar(){
model.setControlbar("显示控制条");
}
}
NetworkModelBuilder.java
package设计模式实验十二周_1;
publicclassNetworkModelBuilderextendsModelBuilder{
publicvoidbuildPlay(){
model.setPlay("网络模式:
");
}
publicvoidbuildMenu(){
model.setMenu("显示菜单");
}
publicvoidbuildPlaylist(){
model.setPlaylist("不显示播放列表");
}
publicvoidbuildMainWindow(){
model.setMainWindow("显示主窗口");
}
publicvoidbuildControlbar(){
model.setControlbar("显示控制条");
}
}
ShortModelBuilder.java
package设计模式实验十二周_1;
publicclassShortModelBuilderextendsModelBuilder{
publicvoidbuildPlay(){
model.setPlay("精简模式:
");
}
publicvoidbuildMenu(){
model.setMenu("显示菜单");
}
publicvoidbuildPlaylist(){
model.setPlaylist("不显示播放列表");
}
publicvoidbuildMainWindow(){
model.setMainWindow("不显示主窗口");
}
publicvoidbuildControlbar(){
model.setControlbar("显示控制条");
}
}
Client.java
package设计模式实验十二周_1;
publicclassClient{
publicstaticvoidmain(Stringargs[]){
ModelBuildermb=(ModelBuilder)XMLUtil.getBean();
Diectordiector=newDiector();
diector.setModelBuilder(mb);
Modelmodel=diector.construct();
System.out.println(model.getPlay());
System.out.println(model.getMenu());
System.out.println(model.getPlaylist());
System.out.println(model.getMainWindow());
System.out.println(model.getControlbar());
}
}
XMLUtil.java
package设计模式实验十二周_1;
importjava.io.*;
publicclassXMLUtil
{
publicstaticObjectgetBean()
{
try
{
DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=dFactory.newDocumentBuilder();
Documentdoc;
doc=builder.parse(newFile("configModel.xml"));
NodeListnl=doc.getElementsByTagName("classname");
NodeclassNode=nl.item(0).getFirstChild();
StringcName=classNode.getNodeValue();
Classc=Class.forName(cName);
Objectobj=c.newInstance();
returnobj;
}
catch(Exceptione)
{
e.printStackTrace();
returnnull;
}
}
}
configModel.xml
UML_1
运行结果:
(2)设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。
浅克隆
Client.java
package设计模式实验十二周_2_1;
publicclassClient{
publicstaticvoidmain(String[]args){
Addressaddress=newAddress("东北",,);
Customerxiaoming=newCustomer("001","小明",13,address);
Customerxiaohong=xiaoming.clone();
xiaohong.setName("小红");
xiaohong.setId("002");
xiaoming.show();
System.out.println("----------");
xiaohong.show();
System.out.println("----------");
System.out.println(xiaoming.equals(xiaohong));
System.out.println(xiaoming.getAddr().equals(xiaohong.getAddr()));
}
}
Address.java
package设计模式实验十二周_2_1;
publicclassAddress{
privateStringhome;
privateStringemail;
privateStringphone;
publicAddress(Stringhome,Stringemail,Stringphone){
this.setHome(home);
this.setEmail(email);
this.setPhone(phone);
}
publicStringgetHome(){
returnhome;
}
publicvoidsetHome(Stringhome){
this.home=home;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetPhone(){
returnphone;
}
publicvoidsetPhone(Stringphone){
this.phone=phone;
}
publicvoidshowAddress(){
System.out.println("Address:
");
System.out.println("Home:
"+getHome());
System.out.println("Email:
"+getEmail());
System.out.println("Phone:
"+getPhone());
}
}
Customer.java
package设计模式实验十二周_2_1;
publicclassCustomerimplementsCloneable{
privateStringid;
privateStringname;
privateintage;
privateAddressaddr;
publicCustomer(Stringid,Stringname,intage,Addressaddr){
this.setId(id);
this.setName(name);
this.setAge(age);
this.setAddr(addr);
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicAddressgetAddr(){
returnaddr;
}
publicvoidsetAddr(Addressaddr){
this.addr=addr;
}
publicCustomerclone(){
Customercus=null;
try{
cus=(Customer)super.clone();
}catch(CloneNotSupportedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returncus;
}
publicvoidshow(){
System.out.println("id:
"+getId()+"name:
"+getName()+"age:
"+getAge());
getAddr().showAddress();
}
}
UML_2
运行结果:
深克隆
Client.java
package设计模式实验十二周_2_2;
publicclassClient{
publicstaticvoidmain(String[]args){
Addressaddress=newAddress("东北",,);
Customerxiaoming=newCustomer("001","小明",13,address);
Customerxiaohong=xiaoming.clone();
xiaohong.setName("小红");
xiaohong.setId("002");
xiaoming.show();
System.out.println("----------");
xiaohong.show();
System.out.println("----------");
System.out.println(xiaoming.equals(xiaohong));
System.out.println(xiaoming.getAddr().equals(xiaohong.getAddr()));
}
}
Address.java
package设计模式实验十二周_2_2;
importjava.io.*;
publicclassAddressimplementsSerializable{
privateStringhome;
privateStringemail;
privateStringphone;
publicAddress(Stringhome,Stringemail,Stringphone){
this.setHome(home);
this.setEmail(email);
this.setPhone(phone);
}
publicStringgetHome(){
returnhome;
}
publicvoidsetHome(Stringhome){
this.home=home;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetPhone(){
returnphone;
}
publicvoidsetPhone(Stringphone){
this.phone=phone;
}
publicvoidshowAddress(){
System.out.println("Address:
");
System.out.println("Home:
"+getHome());
System.out.println("Email:
"+getEmail());
System.out.println("Phone:
"+getPhone());
}
}
Customer.java
package设计模式实验十二周_2_2;
importjava.io.*;
publicclassCustomerimplementsSerializable{
privateStringid;
privateStringname;
privateintage;
privateAddressaddr;
publicCustomer(Stringid,Stringname,intage,Addressaddr){
this.setId(id);
this.setName(name);
this.setAge(age);
this.setAddr(addr);
}
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicAddressgetAddr(){
returnaddr;
}
publicvoidsetAddr(Addressaddr){
this.addr=addr;
}
publicCustomerclone(){
Customercus=null;
try{
ByteArrayOutputStreambaos=newByteArrayOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStreambais=newByteArrayInputStream(baos.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 十二