设计模式之美(c++)-笔记-10-组合
Posted 欢乐的企鹅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之美(c++)-笔记-10-组合相关的知识,希望对你有一定的参考价值。
1. 为什么不推荐使用继承?
继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至不用继承。
2. 组合相比继承有哪些优势?
继承主要有三个作用:表示 is-a 关系,支持多态特性,代码复用。而这三个作用都可以通过组合、接口、委托三个技术手段来达成。除此之外,利用组合还能解决层次过深、过复杂的继承关系影响代码可维护性的问题。
3. 如何判断该用组合还是继承?
尽管我们鼓励多用组合少用继承,但组合也并不是完美的,继承也并非一无是处。在实际的项目开发中,我们还是要根据具体的情况,来选择该用继承还是组合。如果类之间的继承结构稳定,层次比较浅,关系不复杂,我们就可以大胆地使用继承。反之,我们就尽量使用组合来替代继承。除此之外,还有一些设计模式、特殊的应用场景,会固定使用继承或者组合。
#define ENTER_MODULE_10_NAMESPACE namespace NAMESPACE_MODULE_10_PLUS{
#define LEAVE_MODULE_10_NAMESPACE
ENTER_MODULE_10_NAMESPACE
//interface
struct Flyable {
virtual void fly() = 0;
}
struct Tweetable {
virtual void tweet() = 0;
}
struct EggLayable {
virtual void layEgg() = 0;
}
//implementation 飞的行为,每个鸟类实现相同,因此为了复用代码,可以单独实现Flyable接口的fly方法
struct FlyAbility : public Flyable
{
void fly()override {/*implement fly method. */}
};
struct TweetAbility : public Tweetable
{
void tweet()override {/*implement tweet method. */ }
};
struct EggLayAbility : public EggLayable
{
void layEgg()override {/*implement layEgg method. */ }
};
class Ostrich : public Tweetable, public EggLayable {//鸵鸟
public:
//... 省略其他属性和方法...
void tweet() override { tweetAbility.tweet(); }
void layEgg() override { eggLayAbility.layEgg(); }
private:
TweetAbility tweetAbility;//组合 + 委托的技术,解决了代码重复的问题
EggLayAbility eggLayAbility;
}
class Sparrow : public Tweetable, public EggLayable,public Flyable {//麻雀
public:
//... 省略其他属性和方法...
void fly()override { flyAbility.fly(); }
void tweet() override { tweetAbility.tweet(); }
void layEgg() override { eggLayAbility.layEgg(); }
private:
FlyAbility flyAbility;
TweetAbility tweetAbility;
EggLayAbility eggLayAbility;
}
LEAVE_MODULE_10_NAMESPACE
以上是关于设计模式之美(c++)-笔记-10-组合的主要内容,如果未能解决你的问题,请参考以下文章