![]() |
1
1
如何在不放弃对对象生命周期的控制的情况下公开对象的接口?如果我给调用者一个指向页面的指针 除了问题的其余部分,我想特别谈谈这一点。
我建议不要这样做,并且赞成这样的构造函数:
也就是说,不要在打印机中分配页面对象,将其返回给调用者,然后必须担心对象生命周期。相反,放弃对对象生命周期的控制
原则上
,为用户提供灵活性。您希望用户开始一个页面,在其中绘制内容,然后完成该页面。所以,让他们完全这样做:创建一个页面对象,绘制东西,看看它是否有效,或者提供
如果您确实需要工厂:
不管怎样,打印机 作为PageFactory有双重职责,但这里有两个独立的关注点:(1)管理对打印内容的硬件资源的访问,(2)管理用户在软件中创建可打印对象的工作流。打印机不需要同时执行这两项操作,所以可以将它们分开。 同样,对于任何具有状态的对象,将对象本身(具有两个或多个状态)与通过这些状态进行的会话或工作流分离。 我不想让他们删除它
我会尝试设计出这个限制(打印队列,任何人?),这样,尽管在任何时候只有一个页面在实际打印,但可以创建多个页面并同时与打印机驱动程序通信。但印刷只是一个例子。如果页面确实需要在整个页面生命周期内独占使用打印机(例如,如果我们讨论的是互斥和互斥会话,而不是打印机和页面),那么打印机应该有一个API(可能是公共的,可能是通过
|
![]() |
2
4
是的,它叫 state pattern . 一般的想法是打印机对象包含PrinterState对象。Printer对象上的所有(或大多数)方法只是委托给包含的PrinterState。然后,您将拥有多个PrinterState类,这些类根据处于该状态时允许/不允许的内容以不同的方式实现这些方法。PrinterState实现还将提供一个“钩子”,允许它们将Printer对象的当前状态更改为另一个状态。 这里有几个州的例子。这看起来很复杂,但如果您有复杂的特定于状态的行为,它实际上会使编写和维护代码变得更容易:
|
![]() |
3
3
我会把你的东西分开。这些不需要允许客户做任何不愉快的事情。
IPage界面仅显示您需要的内容。它不是“真正的”页面对象,更像是页面的代理。删除(或超出范围)代理需要对真实事物没有影响。 ---对评论的回应--- 第一个问题是:我们“持有”的物体在我们脚下会发生变化吗。我们的代理所指的页面已完成打印,这是使我们的代理无效还是悄悄地成为下一页的代理? 有意义的设计很大程度上取决于问题领域的深层次概念,从我对打印机的个人知识来看,这可能没有帮助。 相反,让我们尝试抽象设计原则。 所以首先:针对不同状态的单独接口确实会使代码更容易编写。我们只是避免愚蠢,比如让毛虫飞,让蛹交配。然而,我们遇到了有多少子状态的问题。。。饥饿的毛虫不同于睡眠的毛虫不同于非常饥饿的毛虫吗? 因此,我们可能仍然会遇到一些“走不动,我在睡觉”的例外情况。
在我看来,页面示例似乎有一个额外的部分:状态更改可能由于内部事件而发生。因此,我们有了一个毛虫,突然它变成了一只蝴蝶。现在我认为我们进入了一个完全不同的模式。它更受事件驱动。因此,我认为我们面临着完全不同的设计挑战。
还有我
也许我可以返回true来表示“打印它”,返回false来表示“保持它”,然后继续工作。 |
![]() |
4
1
除此之外,您还需要一个方便的界面:
然后,主对象可以在进入不同状态时使所有以前的代理失效。通过这种方式,可以将对象的生存期与其有效性分离。删除代理当然也会将其从主对象的代理列表中删除。 |
![]() |
5
0
从协议的角度来看,这两种可能性是相似的:对于这两种实现,某些调用在特定时间将无效。第一种情况是调用函数,第二种情况是调用获取链接对象。
|
![]() |
6
0
这
|
|
simply lemon · python上链表的添加方法 10 月前 |
![]() |
HiroIshida · C++多重继承:实现具有重叠虚函数的接口[重复] 11 月前 |
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 11 月前 |
![]() |
P N Singh · 在CPP Oops中调用对象而不创建它 11 月前 |
![]() |
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
![]() |
Andy Votava · 从父类定义调用学生方法 1 年前 |