Dart Flutter Prototype 原型设计模式

原文 https://medium.flutterdevs.com/prototype-design-patterns-for-dart-flutter-28b82c0552eb

前言

有时候你想复制或者克隆一个当前对象。对于具有更改属性的可变对象,您可能需要一个对象的不同副本,以尽量不破坏第一个对象。

对于不可变项目,其中属性可以被安装但永远不会被修改,特别是那些具有 extension 的或昂贵的引入计划(例如网络调用等)的项目,制作一个副本可能比制作另一个实例更加熟练。这些可以是基本的能力,同时与 Flutter 或 Flutter 应用程序。

这个博客将探索 Flutter 和 Flutter 的原型设计模式。我们将了解如何执行一个演示程序。了解如何在 Flutter 应用程序中实现和使用它。

正文

简介:

原型设计模式是软件开发中的创建性配置设计。当一个原型案例没有完全解决对象问题时,就会使用它,这个原型案例被克隆以创建新的项目。

这种模式用于:

  • 远离客户端应用程序中对象制造者的子类,就像工厂策略设计一样。

  • 避免以标准方式创建另一个对象的固有开销(例如,使用‘ new’关键字) ,因为对于给定的应用程序,这样做的开销是有限的。

要执行该模式,请声明一个理论基类,该基类确定一个纯粹的虚拟克隆()技术。任何需要“多态构造函数”能力的排序都从抽象基类获得自身,并执行 clone() 操作。

Prototype 设计与使对象负有克隆的责任有关。项之外的代码可以通过创建一个无效的新示例进行复制,并依次复制每个属性,但是,设想一个场景,其中对象具有私有属性。

假设一个条目合并了它的克隆策略,私有属性将不会被遗漏,只有实际的对象应该知道它的内部结构。

原型设计模式的优点:

  • 在运行时添加和删除项目ーー模型允许您仅仅通过向客户端注册一个原型案例,就可以将另一个实质性的项目类集成到框架中。这比其他创造性设计更具适应性,因为客户机可以在运行时引入和消除原型。

  • 通过波动的值来确定新的对象ーー异常强大的框架可以让你通过对象组合来描述最近的行为,方法是指出一个项目因子的值,而不是描述新的类。

  • 通过改变结构来显示新对象ーー许多应用程序将对象从各个部分和子部分组装起来。为了方便起见,此类应用程序经常允许您启动复杂的、客户端特征化的设计,以反复利用特定的子电路。

  • 减少子类化ーー工厂方法经常传递与项目类渐进系统匹配的 Creator 类的顺序。Prototype 设计允许您克隆一个模型,而不是请求一个工厂策略生产另一个项目。因此,您不需要为 Creator 类顺序的任何 extension 而烦恼。

克隆可变对象:

这是你可以复制一个不能用 Dart 语克隆自己的可变条目的方式:

class Point {
  int y;
  int z;  Point([this.y, this.z]);
}
final p1 = Point(4, 9);

final p2 = Point(p1.y, p1.z);

final p3 = Point()
  ..y = p1.y
  ..z = p1.z;

Point 类有两个公共的、可更改的属性 y 和 z。使用这样一个简单的类,使用类的构造函数或者使用 Dart 的级联运算符(。.).

这种方法的最大缺点是,我们的应用程序代码目前与 Point 类紧密耦合,需要关于其内部操作的信息来创建一个副本。任何到 Point 的进展都意味着应用程序代码(可能在许多地方)将需要匹配的更改,这是一种拖延和容易出错的情况。

原型设计指示物体应对其自身的克隆负责,例如:

class Point {
  int y;
  int z;  Point([this.y, this.z]);  Point clone() => Point(y, z);
}final p1 = Point(4, 9);
final p2 = p1.clone();

这是一个很大的清理器,目前应用程序代码不会改变,不管后面 Point 是否获得新属性或各种属性,因为 clone() 将持续返回另一个出现的 Point,并且具有相似的值。

克隆不可变对象:

当我们使 Point 不可变时,类似的策略在任何情况下都可以很好地工作:

class Point {
  final int y;
  final int z;  const Point(this.y, this.z);  Point clone() => Point(y, z);
}

final p1 = Point(4, 9);
final p2 = p1.clone();

在这种适应性中,构造函数边界是不可自由选择的,而且一旦引入类的成员变量就不能刷新。这不会影响我们克隆的能力。尽管如此,这个类并没有一个有效的方法来更改这两个属性中的任何一个。

在《 Dart & Flutter 中的不可变数据结构》一书中,您可以看到,添加 copWith() 技术使我们对不可变条目具有更大的适应性:

class Point {
  final int y;
  final int z;
  const Point(this.y, this.z);



  Point copyWith({int y, int z}) {

    return Point(

      y?? this.y,

      z?? this.z,

    );

  }  Point clone() => copyWith(y: y, z: z);
}

final p1 = Point(4, 9);
final p2 = p1.clone();

在这里,copWith() 策略允许您从当前的 Point 创建另一个 Point,同时只更改单个属性。同样,clone() 策略可以用来交付完整的对象复制,这样就不需要我们为克隆描述不同的交互了。

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~

猫哥课程


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://ducafecat.com

Last Updated:
Contributors: ducafecat