解决方法
术语“组合物”和“聚集”意味着或多或少相同的事物并且可以互换使用.在描述容器类(例如列表,动态数组,映射和队列,其中元素都是相同类型)时,可以更频繁地使用聚合;然而,可以发现这两个术语都描述了根据其他类定义的类,无论这些类型是同质的(所有相同的类型)还是异类的(不同类型的对象).
为了更清楚:
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 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.