面向对象设计模式中的“Client”概念是什么?

8

我阅读了许多关于GoF的OOP设计模式的主题,但我对“客户端”概念不确定。那是什么?我们如何在我们的应用程序中实现它?谢谢!

4个回答

6
在 GoF 一书中,客户端是使用模式中的类或代码。
例如,在抽象工厂模式下的动机部分:
考虑一个支持多种外观和行为的用户界面工具包,如 Motif 和 Presentation Manager。不同的外观定义了用户界面小部件(如滚动条、窗口和按钮)的不同外观和行为。为了跨外观标准移植应用程序,应用程序不应将其小部件硬编码到特定外观。在整个应用程序中实例化特定于外观的小部件类使得稍后更改外观变得困难。
我们可以通过定义抽象 WidgetFactory 类来解决这个问题,该类声明了创建每种基本小部件的接口。每种小部件还有一个抽象类,具体子类实现了特定外观标准的小部件。WidgetFactory 的接口具有为每个抽象小部件类返回新小部件对象的操作。客户端调用这些操作以获取小部件实例,但客户端不知道他们正在使用的具体类。因此,客户端保持独立于当前的外观标准。
对于每种外观标准,都有 WidgetFactory 的具体子类。每个子类实现了创建适合外观的小部件的操作。例如,MotifWidgetFactory 上的 CreateScrollBar 操作实例化并返回 Motif 滚动条,而 PMWidgetFactory 上的相应操作返回 Presentation Manager 的滚动条。客户端只通过 WidgetFactory 接口创建小部件,并不知道实现特定外观标准的类。换句话说,客户端只需要承诺由抽象类定义的接口,而不是特定的具体类。
WidgetFactory 还强制执行具体小部件类之间的依赖关系。Motif 滚动条应与 Motif 按钮和 Motif 文本编辑器一起使用,使用 MotifWidgetFactory 就会自动强制执行该约束。

你能举个观察者模式的例子吗? - Trần Minh
我添加了一个来自抽象工厂模式的例子。 - Ray Tayek
非常感谢。我在《设计模式:可复用面向对象软件的基础》中读到了这个。 - Trần Minh

3
作为一种模式,客户端是启动与服务器交互的角色,而服务器是一个功能性的、但通常被动的角色。在客户端提出请求时,服务器会代表客户端执行某些操作并以响应的形式返回报告。
因此,客户端接口的目的是使任意代码都能方便或可能地制定请求并吸引服务器的注意。由于请求消息可能通过各种介质(例如不同的内存空间)传递,通常涉及某种透明的传输,这个传输被隐藏在请求接口后面。
这基本上就是它的概念长短。非常灵活的模式(当然包括客户端/服务器)的一个缺点是需要下降到具体的示例、框架或库来进行具体讲解。

感谢您的快速提问,但也许我仍然无法理解这个面向对象软件设计模式。 - Trần Minh

1

客户端是调用者/使用者。客户端不是子类/实现者。就方法而言,客户端是该方法的调用者;就类而言,客户端是调用该类中方法的调用者。

可以说每个方法都有客户端,因为没有调用者,方法就是死代码;然而,术语客户端通常仅保留给公共方法的调用者,因为私有方法只是实现细节,对设计无关紧要。

在设计图中,例如UML类图,客户端指示公共访问点以及实现后如何使用设计。


0

客户端只是系统中的另一个模块或类,使用具体模式(所有或部分组件构成该模式)。


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