观察者模式实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
青岛理工大学
课程实验报告
课程名称软件设计与体系结构班级软件132 实验日期姓名田清华学号202107208 实验成绩实验名称观察者模式实验
实验目的及要求〔1〕熟悉观察者模式的核心思想;〔2〕掌握观察者模式解决问题的方法。
实验环境Win7, VS2021
实验内容 1. 定义内部数据列表
〔1〕内部数据列表提供数据;
(2)每个数据列表项对应界面表格中的一行。
2. 定义界面控件DataGridview
3. 利用观察者模式实现内部存储的数据列表数据发生变化时,自动更新DataGridview中的内
容。
算法描述及实验步骤1.创立model类student
2.创立抽象目标类data
3.创立具体目标类concretedata
4.创立观察者类DataGridview
5.类图:
调试过程及
实验结果
总结 1.观察者模式可以实现表示层和数据逻辑层的别离,定义了稳定的消息更新传递机制,并抽象了更新接口,是得可以有各种各样不用的表
示层充当具体观察者角色。
2.在观察者目标和观察者之间建立一个抽象的耦合,观察目标只需要
维持一个抽像观察者的集合,无需了解其具体观察者。
3.在C#中实现Observer模式可以采用更有效的方法中提供了
delegate,委托可以看作是一个稳定的接口〔充当抽象观察者角色〕。
附录Student.cs:
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan_6
{
class student
{
private string name;
private string sex;
private int age;
public student(string name,string sex,int age) {
= name;
this.sex = sex;
this.age = age;
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
}
Data.cs:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan_6
{
abstract class data
{
protected List<student> studentList = new List<student>();
protected ArrayList gridviewList = new ArrayList();
//添加观察者
public abstract void Attach(DataGridview dataGridview);
//删除观察者
public abstract void Datach(DataGridview dataGridview);
public abstract void AddStudent(student stu);
public abstract void DeleteStudent(int loc);
public abstract void Display();
//通知方法
public abstract void Notify();
}
}
concreteData.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan_6
{
class concreteData:data
{
public override void Attach(DataGridview dataGridview)
{
gridviewList.Add(dataGridview);
}
public override void Datach(DataGridview dataGridview)
{
gridviewList.Remove(dataGridview);
}
//实现通知方法
public override void Notify()
{
int i = 0;
foreach(object obj in gridviewList)
{
Console.Write("通知第{0}个观察者:",++i);
((DataGridview)obj).UpDate(this);
}
}
//修改数据
public override void AddStudent(student stu)
{
studentList.Add(stu);
Notify();
}
public override void DeleteStudent(int loc)
{
studentList.RemoveAt(loc);
Notify();
}
public override void Display()
{
foreach (student stu in studentList)
{
Console.WriteLine(+" "+stu.Age+" "+stu.Sex); }
}
}
}
dataGridview.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan_6
{
class DataGridview
{
private data data = new concreteData();
public DataGridview(data data) {
this.data = data;
Console.WriteLine("创立一个DataGridview");
}
public void UpDate(data data)
{
this.data = data;
Console.WriteLine("数据改变!");
this.data.Display();
}
}
}
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace shiyan_6
{
class Program
{
static void Main(string[] args)
{
data data1 = new concreteData();
student stu;
DataGridview dataGridview1 = new DataGridview(data1); data1.Attach(dataGridview1);
DataGridview dataGridview2= new DataGridview(data1); data1.Attach(dataGridview2);
//DataGridview dataGridview3 = new DataGridview(data1);
//data1.Attach(dataGridview3);
Console.WriteLine("给data添加数据");
for (int i = 0; i <3; i++)
{
stu = new student("小明" + (i + 1), "女", 18); data1.AddStudent(stu);
}
Console.WriteLine("给data删除数据");
for (int i = 0; i < 3; i++)
{
data1.DeleteStudent(0);
}
Console.ReadLine();
}
}
}。