设计模式

3

我正在尝试理解设计模式(特别是观察者模式)。我正在尝试为下面的场景创建一个设计模式(特别是第二段)。我已经包含了一个UML图表,目前为止我已经成功地创建了它。请问大家是否可以建议该图表是否正确/错误/足够/不足或给我任何有用的提示?我已经尝试使用观察者模式来模拟系统-是否有其他模式可用于模拟此场景?

考虑设计一个系统,为一家航空公司提供飞行预订和航班状态提醒支持。该系统集中存储有关注册客户的信息,并控制客户对信息的访问。客户维护一个简要信息描述文件,包括姓名、居住国家、性别、出生日期、电子邮件地址和手机号码。客户可以通过输入起点和终点的城市名称或机场代码,在该航空公司上搜索往返航班。在找到可接受的航班行程后,客户可以购买经济舱、公务舱或头等舱的航班。完成购买后,客户可以在所支付服务的舱位上选择座位。系统将向客户的警报地址发送有关航班的警报,这可以是电子邮件地址和/或手机号码,具体取决于客户的选择。警报可能表明航班延误、取消或未来版本中可能引入的航班状态的其他更改。
某个时刻,航班将在指定的航班日期上进行购买。客户可以在航班日期前一周内购买航班座位;此日期之后,航班将关闭进一步的座位购买。此外,一旦航班可以购买,其状态即为准时,直到航班前一天,此后可能会因天气延误而延误、因决定取消航班而被取消,并在成功完成航班后降落。航班在取消或降落后将不再存在。

http://i.stack.imgur.com/YB9lJ.jpg

2个回答

1

观察者模式应该是可以的。唯一的评论是您提供的图像不完整。

  1. 尽量避免观察者和主题之间的直接耦合。
  2. 相反,使用一个可以管理所有观察者的类。
  3. 这为您的设计提供了灵活性,使多个主题类发布相同的事件成为可能。如果将来有一个新的主题,您无需对IClient进行任何更改。

当然,这取决于您的需求。

Subject1 -----                                                             ---- Client1
Subject2 ----- ISubject------  Observer implements IObserver  --- IClient  ---- Client2
                                                                           ---- Client3

观察者维护IClient列表并订阅Subject1、subject2等。任何一个主题都可以发送通知以及状态(主题)参考。观察者遍历IClient列表并通知每个客户端。当同一通知可能来自多个主题时,这是很有用的。例如:使用慢双击或在Windows上下文中按F2重命名文件夹。

谢谢!所以在你的例子中,IClient是管理所有观察者的类吗?您能否解释一下您的模型如何工作?我的理解是 - 如果Subject1或2更改,则ISubject会向IObserver发送通知,后者将通知传递给其客户端。但是客户端如何检索主题状态,他们如何知道要从哪个主题检索它? - Creativity2345
好的,只剩最后一件事了...当你说“Observer维护了IClient列表并订阅Subject1、subject2等等。”时,你是指Observer首先获得一个主题列表,然后依次订阅每个主题吗?在这种情况下,需要另一个类来维护主题列表,对吗?或者如果Observer维护可用主题的列表,那么每次添加新主题时,都需要更改Observer,这意味着Observer和Subject之间的耦合仍然存在,对吗?可能我没有正确理解! - Creativity2345
是的,您需要在Observer类中进行修改。优点是您不必修改“n”个客户端。当您添加新客户端时,同样适用,您只需将其添加到要通知的客户端列表中即可。客户端无需订阅所有主题。我相信这应该足够清晰了:)。 - Sandeep G B

0

与Splendor不同,我不会使用一个管理所有观察者的第三类。

  1. 它增加了复杂性。
  2. 将事件重用于其他类型的对象很可能会导致违反Liskov替换原则。

然而,如果你有一个Car类,你可以派生它Volvo : Car,你仍然能够与订阅者一起工作。

换句话说,你的设计是好的。

请注意,我没有阅读你引用的那篇冗长的文本。如果你需要更多帮助,请将文本分成部分,你认为可以应用设计模式的部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接