第十章:一个课堂练习的分析(下)3
10-2 体验设计的灵活性
之所以重新设计,目的之一就是增加灵活性。增加一操作,增加灵活性,就是图象重新装裱。
可以改变边框字符。
首先考虑第九章的初始设计,是否可以作到?在该设计中,根本没有办法判断某一个字符究竟是图象Picture的一部分还是围绕这个Picture组件的一部分。所以根本没有办法找到边框。
在当前设计中, 一个Picture的结构在相应的P_Node类型中有设有显式地体现出来,因此,这样的结构应该提供reframe操作所需要的句柄。
class Picture {
friend ostream& operator<
friend Picture frame(const Picture&);
friend Picture reframe //新增加的
(const Picture&, char, char, char );
//...
};
Picture reframe(const Picture& pic, char c, char s, char t)
{
return pic.p->reframe(c, s, t);
}
class P_Node {
friend Picture reframe(char, char, char);
virtual Picture reframe(char, char, char ) = 0;
//...
};
//如何为每种类型实现reframe
Picture String_Pic::reframe(char, char, char)
{
use++;
return this; //使用私有Picture 构造函数
}
//注意增加引用计数表明还有另一个用户在使用底层的String_Pic,
//重新装裱HCat_Pic和VCat_Pic也是很简单的,只要把各组件Pictures重装裱
Picture Vcat_Pic::reframe(char c, char s, char t)
{
return new Vcat_Pic{
::reframe(top, c, s, t);
::reframe(bottom, c, s, t)
}
}
Picture HCat_Pic::reframe(char c, char s, char t)
{
return new HCat_Pic{
::reframe(left, c, s, t);
::reframe(right, c, s, t);
}
}
//注意我们装裱组件Pictures时,使用了::操作符,调用全局reframe函数
//如果没有,就错了,全局参数四个
//重新设计Frame_Pic 类
class Frame_Pic: public P_Node {
friend Picture frame(const Picture&);
Frame_Pic(const Picture&,
char = "+', char = '|', char = '-');
int height() const;
int width() const;
void display(ostream&, int, int ) const;
Picture reframe(char, char, char);
Picture p;
char corner;
char sideborder;
char topborder;
};
//修改了Frame_Pic的构造函数
Frame_Pic::Frame_Pic
(const Picture& pic, char c, char s, char t) :
p(pic), corner(c), sideborder(s), topborder(t) {}
Picture Frame_Pic::reframe(char c, char s, char t)
{
return new Frame_Pic(::reframe(p, c, s, t), c, s, t);
}
//最后需要重写display,用上那些存储起来的边框字符。
10-3结论
在解决问题的时候,一定要记住,不仅要看到眼前的问题,还要看到长远的变化。在这个问题中:图象是有结构的。
另一个:我们可以利用继承对这些结构进行建模。这一认识让我们使用引用计数技术来管理内存。
最后,我们认识到即使需要显示图象,也无需要重新设定图象的字符。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/409557/viewspace-892175/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/409557/viewspace-892175/