Jexi设计 (4) 文档类设计

文档类Document需要解决的三个问题:

1.?文档数据如何存储:

为了表示文档的层次结构而非显示结构,使用Composite模式,借用GoF的设计,定义接口Glyph,抽象出以下类:

  • Char类:表示一个字符。
  • Picture类:表示一个图片。
  • Paragraph类:由若干个Char和Picture组成的段落,用ArrayList : glyphs存储Char和Picture。

Document类只需要保持一个ArrayList : paragraphs就能访问所有的Paragraph,进而访问任意一个Char或Picture。层次如下:

以上解决了文档的基本数据如何在内存中保存的问题。

2.?文档如何显示:

对于图文混排,要实现“所见即所得”,就需要将上面的基本数据按照一定格式排版,最后渲染到窗口的显示区域中去。对于排版,抽象出以下类:

  • Row类:表示一行,每个Row对象能知道它包含的Char和Picture对象。
  • Page类:表示一页,每个Page对象能知道它包含的Row对象。

层次结构如下:

这样Document类只需要保持一个ArrayList : pages就能知道它包含和显示哪些页,每个Page对象包含一个ArrayList : rows,于是View就能显示出需要显示的Page和Row。

3. 如何排版:

用户的插入或删除操作都会直接导致表示基本数据的Paragraph的修改,此时需要从合适的地方开始重新排版,也就是重新生成Page,Row对象,或者修改现有的Page,Row对象。

排版的过程为:从受影响的Paragraph开始,根据排版算法重新生成必要的Row,然后根据生成的Row组装出新的Page对象:

以上是我的基本想法,主要是把文档数据分成两类:一是基本数据,用于文档的逻辑结构,不包含任何显示逻辑;二是显示模型,根据文档的逻辑结构调用排版算法,生成文档的显示模型,这样以后能添加新的基本元素比如文本框而不影响显示模型,显示模型也能添加新的元素如Column实现分栏显示而不影响逻辑模型,欢迎各位Blogger评价讨论!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值