feature: design patter

This commit is contained in:
binpeng.liu
2023-11-02 16:06:38 +08:00
parent 32eda66409
commit a329691f8a
16 changed files with 1355 additions and 6 deletions

View File

@@ -81,7 +81,7 @@ public class Ostrich extends AbstractBird { // 鸵鸟
这种设计思路虽然可以解决问题,但不够优美。因为除了鸵鸟之外,不会飞的鸟还有很多,比如企鹅。对于这些不会飞的鸟来说,我们都需要重写 fly() 方法抛出异常。这样的设计一方面徒增了编码的工作量另一方面也违背了我们之后要讲的最小知识原则Least Knowledge Principle也叫最少知识原则或者迪米特法则暴露不该暴露的接口给外部增加了类使用过程中被误用的概率。
你可能又会说,那我们再通过 AbstractBird 类派生出两个更加细分的抽象类:会飞的鸟类 AbstractFlyableBird 和不会飞的鸟类 AbstractUnFlyableBird让麻雀、乌鸦这些会飞的鸟都继承 AbstractFlyableBird让鸵鸟、企鹅这些不会飞的鸟都继承 AbstractUnFlyableBird 类,不就可以了吗?具体的继承关系如下图所示:
![](./../assets/oop-mixBetterThanSuper.png)
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/oop-mixBetterThanSuper.png)
从图中我们可以看出,继承关系变成了三层。不过,整体上来讲,目前的继承关系还比较简单,层次比较浅,也算是一种可以接受的设计思路。我们再继续加点难度。在刚刚这个场景中,我们只关注“鸟会不会飞”,但如果我们还关注“鸟会不会叫”,那这个时候,我们又该如何设计类之间的继承关系呢?