Mixin

最近在学习 Dart2 ,接触到 Mixin 只有理解它的设计初衷,才能更好的使用它来设计我们的应用程序。

以下内容摘要与维基百科:

Mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类。[1]Mixin有时被称作"included"而不是"inherited"。mixin为使用它的class提供额外的功能,但自身却不单独使用(不能单独生成实例对象,属于抽象类)。因为有以上限制,Mixin类通常作为功能模块使用,在需要该功能时“混入”,而且不会使类的关系变得复杂。用户与Mixin不是“is-a”的关系,而是“-able”关系

Mixin有利于代码复用[2]又避免了多继承的复杂。[3][4]使用Mixin享有单一继承的单纯性和多重继承的共有性。接口与mixin相同的地方是都可以多继承,不同的地方在于mixin是带实现的。Mixin也可以看作是带实现的interface。这种设计模式实现了依赖反转原则。[5]


综上所述,基本可以理解:Mixin 是实现组合关系的方式。


上面再次,提到 “依赖反转” SOLD 设计原则之一,这里顺带温故了一遍:

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

该原则规定:

  1. 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
  2. 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

该原则颠倒了一部分人对于面向对象设计的认识方式。如高层次和低层次对象都应该依赖于相同的抽象接口。


一图胜千言:


Mixin_第1张图片
图1中,高层对象A依赖于底层对象B的实现;图2中,把高层对象A对底层对象的需求抽象为一个接口A,底层对象B实现了接口A,这就是依赖反转。

上述内容也是摘录于维基

依赖反转网上一堆说法,有些还会和 控制反转 一起描述,个人觉得这些都弄得晦涩难懂,比不上维基的清晰明了,通俗易懂。


什么是高层次模块?什么是低层次模块?

任何软件都是硬件和人类的桥梁,从这个角度来说,软件设计中,越靠近人类这一端的就是高层次模块,越靠近计算机的就是低层次模块。

以移动开发的角度来说,产品的需求就是高层次模块,移动系统提供的 SDK 功能就是低层次模块。

你可能感兴趣的:(Mixin)