请大家帮我设计一个类(把显示和分析分开的一个类)

zxi666 2003-03-14 10:52:13
我需要设计一个类,这个类是用来分析一个东西的,那么势必涉及到分析出来的东西的
显示,可是我不想把显示做到这个分析东西的类中(因为可能有不同的程序会使用这个
分析类,它们的显示各不相同),并且我不想让其他使用这个分析类的程序知道太多的
细节(指的是被分析的这个东西的细节,比如有哪些部分啊,每个部分又分为那些部分
之类的),请问,我应该如何实现比较好一些。



举例来说:
1.我需要一个类CAnalyseFile,用来分析一类文件。也就是分析文件的每个部分
都有哪些东西,相应的值是多少(文件由好几个结构构成,每个结构中又嵌套者
其他的结构)
2.CAnalyseFile中需要不涉及到具体的显示(把分析出来的东西printf或者做成
一个字符串传给别人)
3.使用CAnalyseFile类的程序可能会对不同的分析出来的内容进行不同的显示,包
括对某个数据变量的显示(比如有的用16进制,有的用10进制,有的用2进制等)
4.使用CAnalyseFile类的程序不应该知道这类文件的结构的具体的细节

请问:CAnalyseFile应该如何设计,也就是说应该采用什么机制来和使用它的那些
程序交流这个文件结构的信息。
...全文
31 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
libi 2003-03-16
  • 打赏
  • 举报
回复
View不知道Document的结构,自然是无法显示Document的,View只是一个接口,对各种不同的Document,你还是得为他实现显示的。
你的CAnalyseFile类只是一个封装起来的分析方法,只负责根据入口参数对文件进行分析,并返回分析结果,当然不应该负责显示这些结果。但你应该定义一个消息结构(或标准),将分析的结果告诉程序(例如是图象文件、文本文件、还是可执行文件),由程序再去调用相应的显示类(这些类你得自己实现)。
TopCat 2003-03-14
  • 打赏
  • 举报
回复
我认为可以用Factory Method吧,我对设计模式也不是很熟悉,仅供参考吧,可以问问设计模式方面的高手。
过客猫2022 2003-03-14
  • 打赏
  • 举报
回复
你可以做一个COut这个基类提供你想要输出的纯虚函数!你可以派生它的子类,以实现它的不同的输出.如
const int FORMAT_HEX=1;
const int FORMAT_BINARY=2;
...
class COut{
public:
virual OutInt(int nValue,int nFormat=FORMAT_HEX)=0;
};
class CVCOut:public COut{
public:
OutInt(int nValue,int nFormat=FORMAT_HEX){
//实现代码
}
};
在CAnalyesFile加一个数据成员
class CAnalyesFile{
private:
COut *FOut;
public:
void SetOut(COut *pOut){FOut=pOut;}
};
这样在类中使用时,CAnalyesFile的输出是什么了。
如COut的子类对文件输出的话那么,结果就可以输出到文件。如果对显示输出的话结果就可以输出到显示器:)
Goooder 2003-03-14
  • 打赏
  • 举报
回复
这是我初学Design Pattern的结果,与大家探讨:

1。分析文件的结构,对其不同的部分抽象,分解成原子结构。这些结构具有统一最基本的接口,他们应具有同一基类。这个基类至少有方法draw.这些从基类派生原子类可以组成更大的结构。整个文件可以用composite模式或聚合将这不同的部分组成CAnalyeFile。

2.对于这个原子结构的具体显示方法,使用Bridge模式,将不同的显示类使用统一的调用接口draw(从显示基类派生)。显示方式动态设定,原子结构调用显示基类的显示接口。

3。用户使用CAnalyeFile类提供的遍历方法找到具体结构,设置显示方式进行显示。

4。使用何种显示方法可使用Abstract Factory模式。

5。遍历可用Iterator模式或Visitor模式。

6。保持实时更新可用Observer。

大致是这样,希大家批评指教!
zxi666 2003-03-14
  • 打赏
  • 举报
回复
to veinstone(脉石):
你的方法我觉得不可取,一来这样会把这个问题弄得复杂化;二来一般来说引入一个中间层的
Adapter,是因为已经有了大量的现成的CAnalyseFile和DisplayClass之后所做的一个统一性的
工作,而我的问题里面什么都还没有。所以这样一来,每次修改的不是两边的Adapter Classes,
而可能是除了中间的Transmit Class之外的四个Classes。

to lipengyu666(lipy):
不知道是我没有领会到你的意图,还是你没有领会到我的意思。其实我这个问题抽象出来核心
是一个Document/View问题,而不是多态和继承的问题,是Document和View之间的一个如何折中
的问题。
lipengyu666 2003-03-14
  • 打赏
  • 举报
回复
这是很典型的应用多态和继承的问题。
1:你要抽象出不同数据的共同属性和行为。
2:分析类也要进行抽象,找到分析不同数据的共同行为。
3:细化每个代表不同数据的类,画类的关系图。
4:做好每个界面,根据数据的的不同进行显示。
建议在看看RTTI
veinstone 2003-03-14
  • 打赏
  • 举报
回复
建议:CAnalyseFile--Adapter class--Transmit class ——Adapte class----Display Class

每次修改只要修改两边的Adapter class 就可以了
zxi666 2003-03-14
  • 打赏
  • 举报
回复
我想是我没有把问题阐述清楚吧, zdhsoft(冬瓜猫)的方法不是我想要的,大家设想一下你会
如何来使用这个CAnalyseFile类,假如按照zdhsoft所说,那么会是这样:

CVCOut objOutToScreen ; // 输出方式
CAnalyseFile objAnalyseFile ; // 分析器

objAnalyseFile.SetOut( &objOutToScreen ) ; // 设置输出方式
objAnalyseFile.AttachFile( szFileName ) ; // 设置需要分析的文件
objAnalyseFile.AnalyseFile() ; // 分析这个文件

大致应该是这个样子的吧,可是大家注意到没有,objOutToScreen仅仅是提供了一个输出的方
式而已,具体输出什么东西,可能还是由CAnalyseFile来决定的(所谓可能是要看CVCOut的具
体实现到什么程度)。可是有些东西可能是这段代码不想输出(显示)的,那么怎么处理呢?比
如某个程序仅仅就文件的某个部分的数据感兴趣。

而且,如果把COut做得太复杂,那么CAnalyseFile又和这个类(COut)耦合得太多了。

我自己考虑的解决方案是使用回调函数,由回调函数来决定是否输出,以及如何输出。也就是把
上述的代码改为:

CAnalyseFile objAnalyseFile ;

objAnalyseFile.AttachFile( szFileName ) ;
objAnalyseFile.AnalyseFile( pfnCallBack , pUserData ) ; // pfnCallBack是回调函数
// pUserData是一个用户相关的数据

不过这样一来就要求使用CAnalyseFile类的程序要对文件的格式要有一定的了解。

我的困惑是到底我应该牺牲掉显示的多样性(在CAnalyseFile中完成显示)还是牺牲掉一些
文件格式的封闭性(让类似COut或者上述的回调函数知道文件的结构)?而从实用的角度来看,
我可能会用到显示的多样性(也就是对于一些程序来说,仅仅需要显示分析得到的文件的一部分
的信息),但是我觉得让使用者不了解太多的文件结构应该才是一个好的设计。

希望听到你的建议!
CaptainIII 2003-03-14
  • 打赏
  • 举报
回复
设计模式,不过典型的设计模式(书上的)不是让你套用的,而是告诉你分析与实现的一些方法。结合整个系统的功能,先作出详细的类图吧。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧