适配器(UML 示例情况)

为了使适配器模式的使用和可能更容易理解的情况,这里给出了一个小而简单且非常具体的例子。这里没有代码,只有 UML 以及示例情况及其问题的描述。不可否认,UML 内容就像 Java 一样编写。 (好吧,提示文字说好的例子主要是代码,我认为设计模式足够抽象,也可以用不同的方式介绍。)

通常,适配器模式是适用于具有不兼容接口且无法直接重写的情况的解决方案。

想象一下,你正在运行一个不错的小披萨送货服务。客户可以在你的网站上在线订购,并且你使用 Pizza 类小系统来代表你的比萨并计算账单,税务报告等。比萨饼的价格以一个整数表示,代表价格(以你选择的货币计算)。

StackOverflow 文档

你的送货服务很棒,但在某些时候你不能再自己处理越来越多的客户了,但你仍然希望扩展。你决定将你的比萨添加到大型在线元交付服务的菜单中。他们提供了很多不同的饭菜 - 不仅是比萨饼 - 所以他们的系统更多地使用了抽象,并且有一个接口 IMeal 代表着饭,以及代表钱的类 MoneyAmount

StackOverflow 文档

MoneyAmount 由两个整数作为输入组成,一个用于逗号之前的金额(或一些随机货币),另一个用于逗号后 0 到 99 之间的分数;

StackOverflow 文档

由于你的 Pizza 的价格是一个整数,表示总价格为分数(> 99),因此与 IMeal 不兼容。这就是适配器模式发挥作用的地方:如果需要花费太多精力来更改自己的系统或创建一个新系统,并且必须实现不兼容的接口,则可能需要应用适配器模式。

应用模式有两种方法:类适配器和对象适配器。

两者都有一个共同点,即适配器(PizzaAdapter)作为新接口和适配器(本例中为 Pizza)之间的某种转换器。适配器实现新接口(IMeal),然后从 Pizza 继承并将其自己的价格从一个整数转换为两个(类适配器)

StackOverflow 文档

或者有一个 Pizza 类型的对象作为属性并转换它的值(对象适配器)。

StackOverflow 文档

通过应用适配器模式,你将在不兼容的接口之间进行转换