接第2题,上述方案没有按照用户要求,先绘制正方形再绘制所有圆;此外希望可以隔离以后所有的同类变化,也就是是的DrawAllShapes函数对于绘制顺序的变化是封闭的,下面给出了一种改进的方案。 封闭是建立在抽象的基础之上的。因此,为了让 Drawallshapes对于绘制顺序的变化是封闭的,我们需要种“顺序抽象体”。这个抽象体定义了一个抽象接口,通过这个抽象接口可以表示任何可能的排序策略。 一个排序策略意味着,给定两个对象可以推导出应该先绘制哪一个。我们可以定义一个 Shape类的抽象方法叫作 Precedes。这个方法以另外一个 Shape作为参数,并返回个bool型结果。如果于作为参数传入的 Shape对象绘制函数返回true。 在C++中,这个函数可以通过重载 operators来表示。程序9.3中展示了添加了排序方法后的 Shape。 请分析上述程序,指出存在的不足地方。