『7x24小时有问必答』

项目概览

这五个项目都是关于**原型模式(Prototype Pattern)**在不同场景下的应用演示,每个项目展示了不同的克隆和数据处理方式。

---

1. SimpleProto - 简单原型模式

核心特点

使用标准的  ICloneable  接口实现浅克隆
SwimData.Clone()
  方法直接将 ArrayList 引用传递给新对象
最简单的实现方式,演示原型模式的基本概念

代码写法解释

public object Clone() {

      SwimData newsd = new SwimData(swdata);   // 直接共享 ArrayList

      return newsd;

}

这种写法是浅克隆,原始对象和克隆对象共享同一个 ArrayList,但因为是只读操作,所以在这个场景下是安全的。

---

2. DeepProto - 深克隆原型模式

核心特点

同样使用  ICloneable  接口,但实现的是深克隆
SwimData.Clone()
  方法创建新的 ArrayList,并逐个复制元素

代码写法解释

public object Clone() {

      ArrayList swd = new ArrayList();

      for(int i=0; i< swdata.Count; i++)  

            swd.Add(swdata);   // 创建新的 ArrayList

      SwimData newsd = new SwimData(swd);

      return newsd;

}

这种写法创建了新的集合容器,但集合内的 Swimmer 对象仍然是引用复制(不是真正的深克隆)。这展示了中等深度的克隆——集合独立,但元素共享。

---

3. DeepSexClone - 按性别筛选的克隆

核心特点

创建了新的子类  SexSwimData,继承自 SwimData
添加了  sort(bool isFemale)  方法,可以按性别筛选数据
UI 增加了性别选择单选按钮(Male/Female)

设计意图解释

这个项目展示了如何通过继承和多态扩展原型模式。SexSwimData  不仅实现了克隆,还在克隆后能够按性别过滤数据:
public void sort(bool isFemale) {

      ArrayList swd = new ArrayList();

      for (int i = 0; i < swdata.Count; i++) {

            Swimmer sw = (Swimmer)swdata;

            if (isFemale == sw.isFemale()) {

                  swd.Add(sw);

            }

      }

      swdata = swd;   // 只保留符合条件的游泳者

}

---

4. RevClone - 使用 cloneMe 方法的克隆

核心特点

没有使用  ICloneable  接口,而是自定义了  cloneMe()  方法
同样使用 SexSwimData 子类,支持性别筛选
UI 与 DeepSexClone 相同,有性别选择功能

设计意图解释

cloneMe  方法的写法展示了另一种克隆实现方式:
public void cloneMe(SwimData swdat) {

      swdata = new ArrayList();

      ArrayList swd = swdat.getData();

      for(int i=0; i < swd.Count; i++)  

            swdata.Add(swd);

}

这种方法不使用返回值的  Clone(),而是通过传入源对象来填充当前对象。这在某些框架设计中更灵活,因为可以先创建对象再初始化。

---

5. AgeProto - 按年龄分组的克隆

核心特点

创建了  AgeSwimData  子类
sort()
  方法的实现完全不同:按年龄分组并统计

代码设计意图解释

这个项目的 sort() 方法最有创意:
public override void sort() {

      // 1. 按年龄排序

      // 2. 统计每个年龄的人数

      // 3. 用 "X" 符号表示人数(如 3 个人就是 "XXX")

      // 4. 创建特殊的 Swimmer 对象来存储统计信息

      string name = "";

      for(int j = 0; j < agecount; j++)

            name += "X";

      Swimmer sw = new Swimmer(age.ToString() + " " + name + "," + age.ToString() + ",club,0,F");

}

这种写法将统计数据伪装成 Swimmer 对象,巧妙复用了现有的显示逻辑,展示了原型模式在数据变换中的应用。

---

总结对比表

项目
克隆方式
特殊功能
继承关系
UI 特点
SimpleProto
ICloneable(浅克隆)
基本排序
简单两列
DeepProto
ICloneable(深克隆集合)
基本排序
简单两列
DeepSexClone
ICloneable
按性别筛选
SexSwimData → SwimData
有性别选择
RevClone
自定义 cloneMe()
按性别筛选
SexSwimData → SwimData
有性别选择
AgeProto
自定义 cloneMe()
按年龄分组统计
AgeSwimData → SwimData
简单两列

---

关键技术点

浅克隆 vs 深克隆

浅克隆
:SimpleProto - 共享内部集合
深克隆
:DeepProto - 创建新集合,但元素仍为引用

克隆实现方式

ICloneable 接口
:SimpleProto, DeepProto, DeepSexClone
自定义 cloneMe() 方法
:RevClone, AgeProto

多态应用

SexSwimData
:按性别筛选数据
AgeSwimData
:按年龄分组统计

设计模式演进

这些项目从简单到复杂,逐步展示了:
基本原型模式
深克隆实现
继承扩展功能
不同的克隆接口设计
数据变换与重用
1.webp

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码