- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读一些有关设计模式的书籍,有些将抽象和实现之间的关系描述为组合,有些则将其描述为聚合。现在我想知道:这取决于实现吗?就语言而言?或者上下文?
最佳答案
术语“组合物”和“聚集”的含义或多或少相同,并且可以互换使用。在描述容器类(例如列表、动态数组、映射和队列)时,聚合可能会更频繁地使用,其中元素都属于同一类型;然而,这两个术语都可以描述根据其他类定义的类,无论这些类型是同质的(全部相同类型)还是异质的(不同类型的对象)。
为了更清楚地说明这一点:
class Car {
// ...
private:
Engine engine;
Hood hood;
};
// The car is *composed* of an engine and a hood. Hence, composition. You are
// also bringing together (i.e. *aggregating*) an engine and hood into a car.
抽象和实现之间的关系通常意味着继承,而不是组合/聚合;通常,抽象是接口(interface)或虚拟基类,实现是实现给定接口(interface)的完全具体的类。但是,让事情变得困惑的是,组合/聚合可以是接口(interface)的一部分(因为,例如,您可能需要设置/获取用作构建 block 的对象),并且它们也是一种实现方法(因为您可以使用委托(delegate)来提供实现中方法的定义)。
为了更清楚地说明这一点:
interface Car {
public Engine getEngine();
public Hood getHood();
public void drive();
}
// In the above, the fact that a car has these building blocks
// is a part of its interface (the abstraction).
class HondaCivic2010 implements Car {
public void drive(){ getEngine().drive(); }
// ...
}
// In the above, composition/delegation is an implementation
// strategy for providing the drive functionality.
既然您已将问题标记为“桥”,我应该指出,桥模式的定义是一种使用组合而不是继承来允许多个不同级别的变化的模式。我在大学学到的一个例子......使用继承你可能会得到类似的东西:
class GoodCharacter;
class BadCharacter;
class Mage;
class Rogue;
class GoodMage : public GoodCharacter, Mage;
class BadMage : public BadCharacter, Mage;
class GoodRogue : public GoodCharacter, Rogue;
class BadRogue : public BadCharacter, Rogue;
正如你所看到的,这种事情变得非常疯狂,你得到的类数量多得荒唐。同样的事情,使用桥接模式,看起来像:
class Personality;
class GoodPersonality : public Personality;
class BadPersonality : public Personality;
class CharacterClass;
class Mage : public CharacterClass;
class Rogue : public CharacterClass;
class Character {
public:
// ...
private:
CharacterClass character_class;
Personality personality;
};
// A character has both a character class and a personality.
// This is a perfect example of the bridge pattern, and we've
// reduced MxN classes into a mere M+N classes, and we've
// arguably made the system even more flexible than before.
关于oop - 桥接模式——组合还是聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222785/
我有一个在 Silverlight 中开发的应用程序,它必须连接到另一个我无法控制的遗留应用程序,它需要 3005 端口上的 TCP 连接。 我无法修改旧版应用程序以将端口置于 silverlight
我主要使用 Git 工作,并且在 github 上有很多代码。我也想把它放在 Bitbucket 上,供使用 mercurial 的人使用,但更重要的是,因为我也想在我的 domian 上拥有代码,而
有一个emacs插件可以在emacs中直接编辑confluence页面: http://code.google.com/p/confluence-el/ VIM 有类似的东西吗?我无法找到一些东西。
我已在项目中添加了桥接 header ,但随后我也收到“ProjectName\ProjectName - Bridging-Header.h”文件不存在的错误。 最佳答案 在build设置中,为桥接
我有带 libvirt/kvm 虚拟化的 Linux 主机,虚拟机需要“真实的”静态 IP 地址,所以我决定设置桥接网络。我在主机和虚拟机属性中创建了 br0,我设置了源设备:主机设备 vnet0(B
我正在尝试实现以下模型:我有一个包含一些记录(就像可编辑枚举)的字典表(ProductOffer 表)。另外,我有一个主表 (ChangeNet),它应该存储 ProductOffer 的集合。字典不
我有一个理论,但我不知道如何验证它。我们有一个相当大的 iOS 项目,包含大约 200 个 Swift 文件和 240 个 obj-C 文件(以及等量的头文件)。我们仍在使用 Swift 1.2,这意
简而言之,我正在开发一个嵌入式系统,除其他外,它需要一个从 USB 主机端口到设备端口的桥(这只是第一步,稍后传输的信息将被过滤和更改) . 考虑到这基本上是一个 USB 窥探器/嗅探器,我认为应该有
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos 关于《Strimzi K
网上搜出来的比较乱,讲的不明不白,因此根据自己弄过一次,确认可行的方式,做个备份,方便日后查阅。 环境: 在oracle vm virtualbox中安装的ubuntu,具体版本名是:ubunt
Symfony 的 bundle、vendor 和 bridge 是什么意思? 最佳答案 小贩 一般来说,vendor是项目的依赖项(又名第三方库)。在 Symfony2 中也是同样的意思。 捆 来自
我正在尝试发布发送到 NSB 主机的 WCF 服务。我查看了 NSB 示例中的 WebServiceBridge 示例,但无法弄清楚如何在 WCF 对应项中使用 NServiceBus.WcfServ
我目前正在尝试将 Google Cloud Messaging 库实现到我的 IOS 应用程序中。我按照说明 from here. 进行操作 但是我遇到了桥接头问题。 This is how my p
我正在快速构建一个 Firebase 应用程序,我正确安装了 cocoa pod,然后创建了一个 Objective-C 文件,这样它就可以使我成为一个桥接 header 。当我尝试在应用程序的其他地
我添加到我的项目桥接头文件中,这样我就可以在 swift 中使用 opencv。我决定我不需要 opencv 所以我删除了桥接头文件,在我这样做之后我无法运行我的项目因为这个错误: :0: 错误:打开
我正在使用 Xcode 8.0,我已经手动创建了 Swift Bridging Header。但是我在 Swift Compiler – Code Generation 下找不到选项 Ojective
我有一个 iphone 应用程序,可以通过以 packages 的形式下载额外的内容来丰富它。 此附加内容(包)是使用 MAC OS 应用程序构建的。 MAC OS 应用程序用于收集资源和艺术品、进行
virtualbox中有四种网络连接方式: nat bridged adapter internal host-only adapter vmware中有三种,其实它跟
网上搜出来的比较乱,讲的不明不白,因此根据自己弄过一次,确认可行的方式,做个备份,方便日后查阅。 环境: 在oracle vm virtualbox中安装的ubuntu,具体版本名是:ubuntu
我正在使用 PHP/Java 桥接您可以找到的获取资本 API here .但是在使用 PHP/Java bridge 连接后(它连接正确并且我测试过),我正在尝试通过为此创建一个对象来使用 API,
我是一名优秀的程序员,十分优秀!