ImageReader+
某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。
不同的皮肤4.将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
参考答案:
5.使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。
参考答案:
Multiton-array:
Multiton[]-Multiton()+getInstance():
Multiton:
int+random()
多例模式(MultitonPattern)是单例模式的一种扩展形式,多例类可以有多个实例,而且必须自行创建和管理实例,并向外界提供自己的实例,可以通过静态集合对象来存储这些实
例。
多例类Multiton的代码如下所示:
importjava.util.*;
publicclassMultiton
{
//定义一个数组用于存储四个实例
privatestaticMultiton[]array={newMultiton(),newMultiton(),newMultiton(),new
Multiton()};
//私有构造函数
privateMultiton()
{
}
//静态工厂方法,随机返回数组中的一个实例
publicstaticMultitongetInstance()
{
returnarray[random()];
}
//随机生成一个整数作为数组下标
publicstaticintrandom()
{
Dated=newDate();Randomrandom=newRandom();intvalue=Math.abs(random.nextInt());value=value%4;returnvalue;}publicstaticvoidmain(String
args[])
{
Multitonm1,m2,m3,m4;
m1=Multiton.getInstance();
m2=Multiton.getInstance();
m3=Multiton.getInstance();
m4=Multiton.getInstance();System.out.println(m1==m2);System.out.println(m1==m3);System.out.println(m1==m4);}}
6.使用单例模式设计一个多文档窗口(注:
在JavaAWT/Swing开发中可使用
JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。
参考答案:
实现类似功能也可以)C++或C#(注:
用.
SubFrame-frame:
SubFrame----
MainClass
JButton:
buttonJDesktopPane:
desktopPaneSubFrame:
iFrame
SubFrame()+SubFrame:
getFrame()
MyIFListener
()MainClass+
BtListener
SubFramegetFrame()类充当单例类,在其中定义了静态工厂方法。
代码如下所示:
importjava.awt.*;import
java.awt.event.*;import
javax.swing.*;import
javax.swing.event.*;
//子窗口:
单例类
classSubFrameextendsJInternalFrame
{
privatestaticSubFrameframe;//静态实例
//私有构造函数
privateSubFrame()
{畳数?
子窗体,true,true,true,false);
this.setLocation(20,20);//设置内部窗体位置
this.setSize(200,200);//设置内部窗体大小
this.addInternalFrameListener(newMyIFListener());//监听窗体事件
this.setVisible(true);
}
//工厂方法,返回窗体实例
publicstaticSubFramegetFrame(){
//如果窗体对象为空,则创建窗体,否则直接返回已有窗体
if(frame==null)
frame=newSubFrame();{
}
returnframe;
}
//事件监听器classMyIFListenerextendsInternalFrameAdapter{
//子窗体关闭时,将窗体对象设为null
publicvoid
internalFrameClosing(InternalFrameEvente)
{
if(frame!
=null)
{
frame=null;
}
}
}
}
//客户端测试类
classMainClassextendsJFrame
{privateJButtonbutton;private
JDesktopPanedesktopPane;private
SubFrameiFrame=null;
publicMainClass()
{
畳数?
主窗体);
Containerc=this.getContentPane();c.setLayout(new
BorderLayout());
畢瑴湯渽睥?
畂瑴湯尨点击创建一个内部窗体);
button.addActionListener(newBtListener());c.add(button,
BorderLayout.SOUTH);
desktopPane=newJDesktopPane();//创建DesktopPane
c.add(desktopPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);this.setSize(400,400);
this.show();
}
//事件监听器
classBtListenerimplementsActionListener
{publicvoidactionPerformed(ActionEvente)
{
if(iFrame!
=null)
{
desktopPane.remove(iFrame);
}
iFrame=SubFrame.getFrame();
desktopPane.add(iFrame);
}
}publicstaticvoidmain(String[]
args)
{newMainClass();
}
}
静态的类中定义了一个类SubFrame是JInternalFrame类的子类,在SubFrame
对象并将其返中创建了SubFrameSubFrame类型的实例变量,在静态工厂方法getFrame()类中使用了该单例类,确保子窗口在当前应用程序中只有唯一一个实例,回。
在MainClass
即只能弹出一个子窗口。
2实验search(int[],和查找方法现有一个接口DataOperation定义了排序方法sort(int[])1.
的BinarySearch的quickSort(int[])方法实现了快速排序算法,类int),已知类QuickSort
方法实现了二分查找算法。
试使用适配器模式设计一个系统,在不修binarySearch(int[],int)接口中。
DataOperation和类BinarySearch的方法适配到改源代码的情况下将类QuickSort
参考答案:
绘制类图并编程实现。
(要求实现快速排序和二分查找,使用对象适配器实现)
DataOperation
Client+]intsort(intarray[])[:
QuickSort+int:
search(intarray[],intkey)
+[]:
quickSort(intarray[])int+void:
sort(intarray[],intp,intr)
+intpartition(inta[],intp,intr):
OperationAdapter+voidswap(inta[],inti,intj):
-QuickSort:
sortObj
-BinarySearch:
searchObj
+OperationAdapter(QuickSortsortObj,
BinarySearchsearchObj)+[]:
intsort(intarray[])
BinarySearch+intsearch(intarray[],intkey):
binarySearch(intarray[],intkey):
int+
结构RealPlayer和2.WindowsMediaPlayer是两种常用的媒体播放器,它们的API
,而且在将来可能还API和调用方法存在区别。
现在你的应用程序需要支持这两种播放器需要支持新的媒体播放器,请问如何设计该应用程序?
绘制类图并编程模拟实现。
.
参考答案:
可使用适配器模式和抽象工厂模式,参考类图如下所示:
ClientClass
PlayerFactory
MainWindow+MainWindow:
createMainWindow()+PlayerList:
createPlayerList()
RealPlayerWindow
MediaPlayerWindow
MediaPlayerFactory+MainWindowcreateMainWindow():
+PlayerList:
createPlayerList()
RealPlayerAPIMediaPlayerAPI
RealPlayerFactory+MainWindowcreateMainWindow():
+PlayerList:
createPlayerList()PlayerList
MediaPlayerList
RealPlayerList
在该类图中,为两种不同的播放器提供了两个具体工厂类MediaPlayerFactory和
播放器工厂,可以RealPlayerFactory,其中MediaPlayerFactory作为WindowsMediaPlayer
(为和播放列表(MediaPlayerList)Player的主窗口(MediaPlayerWindow)创建WindowsMedia
了简化类图,只列出主窗口和播放列表这两个播放器组成元素,实际情况下包含更多组成元,窗RealPlayer创建的主口素作);RealPlayerFactory为RealPlayer播器放工厂,此时可以使用抽象工厂模式,客户端针对(RealPlayerWindow)和播放列表(RealPlayerList)编程,如果增加新的播放器,只需增加一个新的具体工厂来生产新PlayerFactory抽象工厂
中的方法,因此还需要使用适配器模式,在API产品族中的产品即可。
由于需要调用现有
中API调用MediaPlayerWindowsMediaPlayerList具体产品类如MediaPlayerWindow和
的方法,在RealPlayerWindow和RealPlayerList中调用RealPlayerAPI中的方法,实现对
API中方法的适配,此时具体产品如MediaPlayerWindow、RealPlayerWindow等充当适配是需要适配的适配者。
RealPlayerAPI和MediaPlayerAPI如API器,而已有的.
的框架,该软件既可以对某个文件夹使用组合模式设计一个杀毒软件(AntiVirus)3.、TextFile(File)进行杀毒,文件种类包括文本文件(Folder)杀毒,也可以对某个指定的文件VideoFile。
绘制类图并编程模拟实现。
图片文件ImageFile、视频文件参考答案:
AbstractFilebstract}{a+void:
add(AbstractFilefile)+void:
remove(AbstractFilefile)+AbstractFilegetChild(inti):
+void:
killVirus()fileList
FolderVideoFileImageFile-ArrayList:
fileListname:
String--name:
String-String:
name++VideoFile(Stringname)ImageFile(Stringname)+++Folder(Stringname)voidadd(AbstractFilefile):
add(AbstractFilefile)void:
+++voidadd(AbstractFilefile):
void:
remove(AbstractFilefile):
voidremove(AbstractFilefile)+++void:
remove(AbstractFilefile)AbstractFilegetChild(inti)getChild(inti):
AbstractFile:
+++AbstractFilegetChild(inti):
voidkillVirus()killVirus():
void:
+voidkillVirus():
TextFilename:
String-+TextFile(Stringname)+void:
add(AbstractFilefile)+voidremove(AbstractFilefile):
+AbstractFilegetChild(inti):
+void:
killVirus()
4.某教育机构组织结构如下图所示:
北京总部校湖南分行政办公室教务办公室行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室教务办公室行政办公室
系统中可以给各级办公室下发公文,试采用组合模式设计该机构OA在该教育机构的的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
参考答案:
参考类图如下所示:
Unitbstract}a{handleArchives():
void+
Office
Institutionname:
String-list-ArrayListlist:
+Office(Stringname)-Stringname:
+voidhandleArchives():
+Institution(Stringname