设计模式十四.docx
《设计模式十四.docx》由会员分享,可在线阅读,更多相关《设计模式十四.docx(15页珍藏版)》请在冰豆网上搜索。
![设计模式十四.docx](https://file1.bdocx.com/fileroot1/2023-1/28/23643221-3489-4fe4-9017-81a431d9edc3/23643221-3489-4fe4-9017-81a431d9edc31.gif)
设计模式十四
一.实验目的
1.熟悉UML统一建模语言;
2.回顾熟悉适配器模式、桥接模式、组合、装饰模式;
3.熟悉XML文件的操作;
4.熟悉java的反射机制。
二.实验内容
(1)使用Java语言实现一个双向适配器实例,使得猫可以学狗叫,狗可以学猫抓老鼠。
(2)某日志记录器(Logger)既可以支持不同的操作系统,还可以支持多种编程语言,并且可以使用不同的输出方式。
使用桥接模式设计该系统。
(3)使用组合设计模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
(4)某图书管理系统中,书籍类(Book)具有借书方法borrowBook()和还书方法returnBook()。
现需要动态给书籍对象添加冻结方法freeze()和遗失方法lose()。
使用装饰模式设计该系统。
三.实验环境
PC微机;
Windows操作系统;
VisualStudio程序集成环境。
4.实验内容
(1)使用Java语言实现一个双向适配器实例,使得猫可以学狗叫,狗可以学猫抓老鼠。
ArealCat.java
package设计模式实验十四周_1;
publicclassArealCatimplementsCat{
publicvoidcatlooks(){
System.out.println("Iamarealcat,Ihavearealcatlooks.");
}
publicvoidzhuoshu(){
System.out.println("Iamarealcat,Ihavecancatchamouse.");
}
}
ArealDog.java
package设计模式实验十四周_1;
publicclassArealDogimplementsDog{
publicvoiddoglooks(){
System.out.println("Iamarealdog,Ihavearealdoglooks.");
}
publicvoidbark(){
System.out.println("Iamarealdog,Ihavebark.");
}
}
Cat.java
package设计模式实验十四周_1;
publicinterfaceCat{
publicvoidcatlooks();
publicvoidzhuoshu();
}
CDAdapter.java
package设计模式实验十四周_1;
publicclassCDAdapterimplementsCat,Dog{
Catcat=null;
publicCDAdapter(Catcat){
this.cat=cat;
}
publicvoiddoglooks(){
System.out.println("Iamadog,too.");
}
publicvoidbark(){
cat.zhuoshu();
}
Dogdog=null;
publicCDAdapter(Dogdog){
this.dog=dog;
}
publicvoidcatlooks(){
System.out.println("Iamacat,too");
}
publicvoidzhuoshu(){
dog.bark();
}
}
Dog.java
package设计模式实验十四周_1;
publicinterfaceDog{
publicvoiddoglooks();
publicvoidbark();
}
Client.java
package设计模式实验十四周_1;
publicclassClient{
publicstaticvoidmain(String[]args){
CatAFakeCat=newCDAdapter(newArealDog());
AFakeCat.catlooks();
AFakeCat.zhuoshu();
DogAFakeDog=newCDAdapter(newArealCat());
AFakeDog.doglooks();
AFakeDog.bark();
}
}
UML.java
实验结果:
(2)某日志记录器(Logger)既可以支持不同的操作系统,还可以支持多种编程语言,并且可以使用不同的输出方式。
使用桥接模式设计该系统。
Logger.java
package设计模式实验十四周_2;
publicclassLogger{
protectedLanguagelanguage;
protectedOperationSystemoperationSystem;
publicLanguagegetLanguage(){
returnlanguage;
}
publicOperationSystemgetOperationSystem(){
returnoperationSystem;
}
publicvoidsetLanguage(Languagelanguage){
this.language=language;
}
publicvoidsetOperationSystem(OperationSystemoperationSystem){
this.operationSystem=operationSystem;
}
publicvoidoutput(){
System.out.println("输出Logger.");
}
}
Consolelog.java
package设计模式实验十四周_2;
publicclassConsolelogextendsLogger{
publicvoidoutput(){
System.out.println("用"+operationSystem.Output()+"操作系统,"+language.Output()+"编写,输出Consolelog.");
}
}
Filelog.java
package设计模式实验十四周_2;
publicclassFilelogextendsLogger{
publicvoidoutput(){
System.out.println("用"+operationSystem.Output()+"操作系统,"+language.Output()+"编写,输出Filelog.");
}
}
XMLlog.java
package设计模式实验十四周_2;
publicclassXMLlogextendsLogger{
publicvoidoutput(){
System.out.println("用"+operationSystem.Output()+"操作系统,"+language.Output()+"编写,输出XMLlog.");
}
}
OperationSystem.java
package设计模式实验十四周_2;
publicabstractclassOperationSystem{
publicabstractStringOutput();
}
Linux.java
package设计模式实验十四周_2;
publicclassLinuxextendsOperationSystem{
publicStringOutput(){
return"Linux";
}
}
Unix.java
package设计模式实验十四周_2;
publicclassUnixextendsOperationSystem{
publicStringOutput(){
return"Unix";
}
}
Windows.java
package设计模式实验十四周_2;
publicclassWindowsextendsOperationSystem{
publicStringOutput(){
return"Windows";
}
}
Language.java
package设计模式实验十四周_2;
publicabstractclassLanguage{
publicabstractStringOutput();
}
Cyuyan.java
package设计模式实验十四周_2;
publicclassCyuyanextendsLanguage{
publicStringOutput(){
return"C语言";
}
}
Pascal.java
package设计模式实验十四周_2;
publicclassPascalextendsLanguage{
publicStringOutput(){
return"Pascal";
}
}
Java.java
package设计模式实验十四周_2;
publicclassJavaextendsLanguage{
publicStringOutput(){
return"Java";
}
}
Client.java
package设计模式实验十四周_2;
publicclassClient{
publicstaticvoidmain(String[]args){
Cyuyancyuyan=newCyuyan();
Javajava=newJava();
Pascalpascal=newPascal();
Linuxlinux=newLinux();
Windowswindows=newWindows();
Unixunix=newUnix();
Consolelogconsolelog=newConsolelog();
consolelog.setLanguage(cyuyan);
consolelog.setOperationSystem(linux);
consolelog.output();
Filelogfilelog=newFilelog();
filelog.setLanguage(java);
filelog.setOperationSystem(windows);
filelog.output();
XMLlogxmllog=newXMLlog();
xmllog.setLanguage(pascal);
xmllog.setOperationSystem(unix);
xmllog.output();
}
}
UML.java
实验结果:
(3)使用组合设计模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
AntiVirus.java
package设计模式实验十四周_3;
publicabstractclassAntiVirus{
publicabstractvoidscan();
}
ImageFile.java
package设计模式实验十四周_3;
publicclassImageFileextendsAntiVirus{
publicvoidscan(){
System.out.println("扫描图片文件");
}
}
TextFile.java
package设计模式实验十四周_3;
publicclassTextFileextendsAntiVirus{
publicvoidscan(){
System.out.println("扫描文本文件");
}
}
VideoFile.java
package设计模式实验十四周_3;
publicclassVideoFileextendsAntiVirus{
publicvoidscan(){
System.out.println("扫描视频文件");
}
}
Folder.java
package设计模式实验十四周_3;
importjava.util.*;
publicclassFolderextendsAntiVirus{
privateArrayListlist=newArrayList();
publicvoidadd(AntiViruselement){
list.add(element);
}
publicvoidremove(AntiViruselement){
list.remove(element);
}
publicvoidscan(){
for(Objectobject:
list){
((AntiVirus)object).scan();
}
}
}
Client.java
package设计模式实验十四周_3;
publicclassClient{
publicstaticvoidmain(Stringa[]){
AntiVirusobj1,obj2,obj3,obj4,obj5;
Folderfolder1,folder2,folder3;
obj1=newImageFile();
obj2=newTextFile();
folder1=newFolder();
folder1.add(obj1);
folder1.add(obj2);
obj3=newVideoFile();
obj4=newVideoFile();
folder2=newFolder();
folder2.add(obj3);
folder2.add(obj4);
obj5=newImageFile();
folder3=newFolder();
folder3.add(folder1);
folder3.add(folder2);
folder3.add(obj5);
folder3.scan();
}
}
UML.java
实验结果:
(4)某图书管理系统中,书籍类(Book)具有借书方法borrowBook()和还书方法returnBook()。
现需要动态给书籍对象添加冻结方法freeze()和遗失方法lose()。
使用装饰模式设计该系统。
Book.java
package设计模式实验十四周_4;
publicinterfaceBook{
publicvoidborrowBook();
publicvoidreturnBook();
}
Ibook.java
package设计模式实验十四周_4;
publicclassIbookimplementsBook{
publicvoidborrowBook(){
System.out.println("借书!
");
}
publicvoidreturnBook(){
System.out.println("还书!
");
}
}
Changer.java
package设计模式实验十四周_4;
publicclassChangerimplementsBook{
privateBookbook;
publicChanger(Bookbook){
this.book=book;
}
publicvoidborrowBook(){
book.borrowBook();
}
publicvoidreturnBook(){
book.returnBook();
}
}
LoseBook.java
package设计模式实验十四周_4;
publicclassLoseBookextendsChanger{
publicLoseBook(Bookbook){
super(book);
}
publicvoidlose(){
System.out.println("这本书已经遗失");
}
}
FreezeBook.java
package设计模式实验十四周_4;
publicclassFreezeBookextendsChanger{
publicFreezeBook(Bookbook){
super(book);
}
publicvoidfreeze(){
System.out.println("这本书已经被冻结");
}
}
Client.java
package设计模式实验十四周_4;
publicclassClient{
publicstaticvoidmain(String[]args){
Ibookibook=newIbook();
ibook.borrowBook();
ibook.returnBook();
System.out.println("-------------------------");
FreezeBookfreezebook=newFreezeBook(ibook);
freezebook.borrowBook();
freezebook.returnBook();
freezebook.freeze();
System.out.println("-------------------------");
LoseBooklosebook=newLoseBook(ibook);
losebook.borrowBook();
losebook.returnBook();
losebook.lose();
}
}
UML.java
实验结果: