设计模式C#案例.doc_第1页
设计模式C#案例.doc_第2页
设计模式C#案例.doc_第3页
设计模式C#案例.doc_第4页
设计模式C#案例.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式 C#案例GRASP-通用责任分配软件模式,GoF-“四人帮”设计模式。以下案例,JAVA和VC+程序员请分别采用JAVA和VC+程序实现。为减少测试代码量,采用了C#控制台应用程序;编程环境为微软VS .Net 2008。1. GRASP模式:多态 C#案例学习多态以及集合类(Main方法中List和Array类)的用法。多态案例:Person类有虚方法Show(),该类派生出2个子类:Student、Teacher。1.1 设计类图1.2 案例代码 public class Person public Person() public Person(string name, string sex) this.Name = name; this.Sex = sex; public override string ToString() return name + Name + , sex + Sex + ; public virtual void Show() /C#虚方法 Console.WriteLine(Person: + this.ToString(); public string Name get; set; public string Sex get; set; public class Student : Person public Student() public Student(string name, string sex,string studentNo,string classname) this.Name = name; this.Sex = sex; this.StudentNO = studentNo; this.Classname = classname; public override string ToString() return base.ToString() + student NO + StudentNO + , class + Classname + ; public override void Show() Console.WriteLine(Student: + this.ToString(); public string StudentNO get; set; public string Classname get; set; public class Teacher : Person public Teacher() public Teacher(string name, string sex, string department, string professionalTitle) this.Name = name; this.Sex = sex; this.Department = department; this.ProfessionalTitle = professionalTitle; public override string ToString() return base.ToString() + department + Department + , professional title + ProfessionalTitle + ; public override void Show() Console.WriteLine(Teacher: + this.ToString(); public string Department get; set; public string ProfessionalTitle get; set; class Program static void Main(string args) Console.WriteLine(Test class System.Collections.Generic.List .); List persons = new List();/Person家族(Person及其子孙类)类对象均可存入其中 Person p1 = new Person(张三, 男); persons.Add(p1); /List.Add()方法 persons.Add(new Person(李丽, 女); persons.Add(new Student(张强, 男, 201201189,计科1201); persons.Add(new Person(Jack, man); persons.Add(new Teacher(田建华, 男, 电信学院, 讲师); persons.Add(new Teacher(包小军, 男, 计科院, 副教授); foreach (Person p in persons) p.Show();/此时调用的是哪个类的Show()方法? persons.Remove(p1); /List.Remove()方法 foreach (Person p in persons) p.Show(); Console.WriteLine(nTest class System.Array .); Array arrPerson = Array.CreateInstance(typeof(Person), persons.Count); int i = 0; foreach (Person p in persons) arrPerson.SetValue(p, i); i+; /Array.SetValue() foreach (Person p in arrPerson) p.Show(); Console.WriteLine(nAfter Array.Reverse() .); Array.Reverse(arrPerson); /静态方法,通过类名引用,而不是对象名引用 for (i = 0; i arrPerson.Length; i+) Person p = (Person)arrPerson.GetValue(i); /Array.GetValue() p.Show(); 1.3 练习与思考(1)申明 Person P; 则P可以引用Person、Student、Teacher等3个类的任意对象吗?若可以,则P.Show() 调用的又是哪个类的Show()方法?(2)对家族类对象中的抽象方法(及C# Virtual方法)的多态性有何体会和认识?(3)集合类(C#的 List,Array等)是家族类对象的容器,这2个集合类有何区别?试一试其它成员函数,以及其它C#集合类。(4)System.Object是C#所有类的根类,说明了什么?它有哪些虚方法,说明了什么?2. GoF模式:观察者 C#案例2.1 类图观察者模式,也称“发布-订阅”、“委托”、“模型-视图”、“监听者”或“从属者”等模式;该设计模式有助于理解:Windows消息机制、C#委托、VC API回调(CallBack)、Oracle和MS SQL Server监听器等概念和实现机制。教案中原UML设计类图如下:案例:被观察目标-“猫”、观察者-“老鼠”和“狗”,猫叫则老鼠逃,猫叫则狗追打;设计2个接口、3个类(Cat、Mouse、Dog)和一个测试程序类(Program)。案例的设计类图如下:2.2 案例代码 interface IObject /目标接口类 void attach(IObserver obs); /注册 void detach(IObserver obs); /注销 void notify(); /通知 interface IObserver /观察者接口类 void update();/响应 class Cat : IObject /猫-目标类 public String Name get; set; private List obsList; public Cat(String name) . public void cry() . public void attach(IObserver obs) obsList.Add(obs); public void detach(IObserver obs) . public void notify() /通知每一个关注该目标的观察者对象 foreach (IObserver obs in obsList) obs.update(); class Mouse : IObserver /老鼠-观察者类 public String Name get; set; public Mouse(String name) this.Name = name; public void update() Console.WriteLine(Mouse + this.Name + : run away!); class Dog : IObserver /狗-观察者类 public String Name get; set; public Dog(String name) this.Name = name; public void update() Console.WriteLine(Dog + this.Name + : dont cry now!); class Program static void Main(string args) Cat C1 = new Cat(Tom); Cat C2 = new Cat(Cat2); Mouse m1 = new Mouse(M1); C1.attach(m1); Mouse m2 = new Mouse(M2); Mouse m3 = new Mouse(M3); C1.attach(m3); Dog D1 = new Dog(D1); C1.attach(D1); Dog D2 = new Dog(D2); C1.attach(D2); C2.attach(D2); C1.cry(); C2.cry(); C1.detach(m3); C1.detach(D2); C1.cry(); 2.3 练习与思考(1)接口IObject更改设计为类CObject,将obsList属性放入该类,并在该类中实现attach()、detach()、notify()等三个方法,是否更好?这样,扩展CObject的子类(目标类)如Cat就非常简单了;请实现之。(2)更改设计成为三个:接口IObject、类CObject、子类Cat呢?(3)思考:C#委托,与观察者模式有何关系?(4)股票案例:有多支股票受股民关注,目标和观察者分别是?若股民对股票的反应是:若涨价或跌价到x%或x元,则通知股民或自动帮股民买进或卖出;该案例该怎么设计,请给出设计类图。3. GoF模式:组合模式 C#案例案例:将“多态C#案例”修改成为组合模式,增加团体(组织、社团等)类,团体可以包括人(Person、Student、Teacher)、也可以包括其它团体。设计:增加接口ITeam 和团体类Team,Team和Person均实现接口ITeam;而团体类Team应设计一个集合类对象,可容纳多个ITeam对象。注:原Person类及Student和Teacher类的成员及其实现代码不变。3.1 类图3.2 案例代码 public interface ITeam /团体接口类 void Show(); public class Team : ITeam /团体类 private string TeamName; private List persons; public Team( string teamname) TeamName = teamname; persons = new List(); public void Show() Console.WriteLine(Team name is: + TeamName); foreach (ITeam p in persons) p.Show(); public void Add(ITeam t) persons.Add(t); /添加 public void Remove(ITeam t) persons.Remove(t); /移出 public ITeam GetChild(ITeam t) return null; /请设计函数原型并实现其代码 public class Person : ITeam /实现接口ITeam,Person其它代码不用修改.测试程序 Main 如下: Console.WriteLine(Client test . n - 1 -); Team stu01 = new Team(计科1101班); Student s1 = new Student(A, M, 201103123, JK1101); stu01.Add(s1); Student s2 = new Student(B, F, 201103125, JK1101); stu01.Add(s2); stu01.Sh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论