为什么 Flutter钟爱 装饰器模式和组合模式 ?

541 阅读2分钟

理由1:设计模式的基本原则

GOF(四人帮,全拼 Gang of Four), 于1994年四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,提出了此概念。

  • 对接口编程而不是对实现编程。

  • 优先使用对象组合而不是继承。

2391647917781_.pic.jpg

理由2:UI布局可读性更高

例如:通过代码嵌套的方式,Stack 是被加到Container里面,Positioned 组件是加在Stack 组件里面。Text又是被加到Positioned里面。层级关系一清二楚,代码也可以展开折叠!


Container(

          child: Stack(

            children: [

              Positioned(

                child: Text("top"),

                left: 10,

                top: 10,

              ),

              Positioned(

                child: Text("bottom"),

                bottom: 10,

                right: 10,

              ),

            ],

          ),

        )

如果不用装饰器模式+组合模式,会怎么样【下面是iOS UI的代码】


[self.positionedView1 addSubview:bottomText];

[self.positionedView2 addSubview:topText];

[self.stackView addSubview:self.positionedView1];

[self.stackView addSubview:self.positionedView2];

[self.containerView addSubview:self.stackView];

addSubview代码满天飞,如果addSubview的次序搞错了,子View就会被父View遮挡。

上面还不包括UI控件创建的代码,再加上逻辑,耦合度太高了

理由3:语义化更明显:

案例:给ListView添加滚动指示器


//在ListView外层包裹一个Scrollbar,并且将自身作为参数传入Scrollbar

Scrollbar(

        child: ListView.builder(

          itemBuilder: (BuildContext context, int index) {

            return Text("index:$index");

          },

          itemCount: 200,

        ),

      )

Scrollbar+ListView = 带滚动指示器的列表

理由4:装饰器模式+组合模式践行着 面向对象的六大原则

  • 单一职责原则【Single Responsibility Principle】

  • 开闭原则   【Open Closed Principle】:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

  • 里式替换原则【Liskov Substitution Principle】

  • 依赖倒置原则【Dependence Inversion Principle】

  • 接口隔离原则 【Interface Segregation Principle】

  • 迪米特原则 【Law of Demeter 低耦合,高内聚】

组合模式:通过树型结构的问题中,通过模拟树🌲的层级关系,从而使得客户程序与复杂元素的内部结构解耦。

装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。实现低耦合,高内聚的代码(迪米特原则),同时满足【开闭原则】(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭),同时Flutter众多的Widget也体现了单一职责原则和接口隔离原则。