设计模式c#案例

上传人:xzh****18 文档编号:45985221 上传时间:2018-06-20 格式:DOC 页数:10 大小:153.50KB
返回 下载 相关 举报
设计模式c#案例_第1页
第1页 / 共10页
设计模式c#案例_第2页
第2页 / 共10页
设计模式c#案例_第3页
第3页 / 共10页
设计模式c#案例_第4页
第4页 / 共10页
设计模式c#案例_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《设计模式c#案例》由会员分享,可在线阅读,更多相关《设计模式c#案例(10页珍藏版)》请在金锄头文库上搜索。

1、设计模式 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 Personpublic Person() public Person(stri

2、ng 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 : Personpubl

3、ic 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 overr

4、ide void Show()Console.WriteLine(“Student: “ + this.ToString();public string StudentNO get; set; public string Classname get; set; public class Teacher : Personpublic Teacher() public Teacher(string name, string sex, string department, string professionalTitle) this.Name = name;this.Sex = sex;this.D

5、epartment = 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 Departm

6、ent get; set; public string ProfessionalTitle get; set; class Programstatic 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

7、 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.R

8、emove()方法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();Consol

9、e.WriteLine(“nAfter Array.Reverse() .“);Array.Reverse(arrPerson); /静态方法,通过类名引用,而不是对象名引用for (i = 0; i ,Array 等)是家族类对象的容器,这 2 个集合类有何区别?试一试其它成员函数,以及其它 C#集合类。(4)System.Object 是 C#所有类的根类,说明了什么?它有哪些虚方法,说明了什么?2. GoF 模式:观察者 C#案例2.1 类图观察者模式,也称“发布-订阅” 、 “委托” 、 “模型-视图” 、 “监听者”或“从属者”等模式;该设计模式有助于理解:Windows 消息机制、

10、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 IO

11、bserver /观察者接口类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

12、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.

13、Name = name; public void update() Console.WriteLine(“Dog “ + this.Name + “: dont cry now!“); class Programstatic 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 D

14、1 = 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、类CObje

15、ct、子类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: “ + T

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号