码迷,mamicode.com
首页 > 其他好文 > 详细

四、集合与泛型、委托与事件-----《大话设计模式》

时间:2015-09-16 21:44:15      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

一、集合与泛型

  数组 集合(ArrayList) 泛型
优点 连续存储、快速从头到尾遍历和修改元素 使用大小可按需动态增加 类型安全;省去拆箱和装箱操作
缺点 创建时必须制定数组变量的大小;
两个元素之间添加元素比较困难
类型不安全,接受所有类型的数据;
导致一直进行拆箱和装箱操作,带来很大的性能消耗
 
public partial class Form1 : Form
{
    IList arrayAnimal_list = new ArrayList();                    //声明并初始化集合
    IList<Animal> arrayAnimal;                                   //声明泛型


private void button3_Click(object sender, EventArgs e)
{
    foreach (Animal item in arrayAnimal_list)                   //遍历集合
    {
        MessageBox.Show(item.Shout());
    }
}
private void button7_Click(object sender, EventArgs e)
{
    arrayAnimal_list.RemoveAt(1);                              //初始计数为0,当1号位数据被删掉后,2号位数据的计数会变为1
    arrayAnimal_list.RemoveAt(1);                              //这样才能删除其后数据,它始终都保证元素的连续性
}

private void button4_Click(object sender, EventArgs e)
{
    arrayAnimal = new List<Animal>();                              //初始化泛型
     arrayAnimal.Add(AnimalFactory.CreateAnimal("", "小花", 1));  //其添加指定类型数据 
     arrayAnimal.Add(AnimalFactory.CreateAnimal("", "阿毛", 2));
    MessageBox.Show(arrayAnimal.Count.ToString());                //获得元素个数
}
}

二、委托与事件

委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有安全相同的行为;事件是在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。

个人理解是为了让一个类能在内部执行其他类的方法,与观察者模式结合会有更好的效果。

class Program                            //委托和事件都在Cat类中定义,是为了由Cat类去触发Mouse类;当Cat发出叫声时,Mouse就会跑
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("Tom");
            Mouse mouse1 = new Mouse("Jerry");                                               
            Mouse mouse2 = new Mouse("Jack");
            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);    //这两行表示将Mouse的Run方法通过实例化委托
              cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);    //Cat.CatShoutEventHandler登记到Cat的事件CatShout当中

              cat.Shout();                                                //实现猫一叫,老鼠就跑的需求
              Console.Read();
        }
    }

    //无参数委托事件
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler();         //声明委托CatShoutEventHandler
        public event CatShoutEventHandler CatShout;         //声明事件CatShout,它的事件类型是委托CatShoutEventHandler     

        public void Shout()
        {
            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)
            {
                CatShout();                              //当执行Shout()方法时,如果Catshout中有对象登记事件,则执行CatShout();
            }
        }
    }

    class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run()
        {
            Console.WriteLine("老猫来了,{0}快跑!", name);
        }
    }
 

 

//有参数委托事件,增加了一个CatShoutEventArgs,用来传递Cat的名字
    class Cat
    {
        private string name;
        public Cat(string name)
        {
            this.name = name;
        }

        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);     //声明委托时有两个参数
         public event CatShoutEventHandler CatShout;                        //sender用来指向发送通知的对象,args用来传递数据

        public void Shout()
        {
            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)
            {
                CatShoutEventArgs e = new CatShoutEventArgs();                 //实例化参数
                   e.Name = this.name;
                CatShout(this, e);                                             //当事件触发时,将这两个参数传递给委托
            }
        }
    }
class Mouse
    {
        private string name;
        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run(object sender, CatShoutEventArgs args)               //由于委托增加了两个参数,这里也增加了两个参数
        {
            Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
        }
    }

public class CatShoutEventArgs : EventArgs                                   //继承EventArgs,用来传递数据 
{ 
  private string name; 
  public string Name 
  { 
get { return name; } 
set { name = value; } 
  } 
} 

四、集合与泛型、委托与事件-----《大话设计模式》

标签:

原文地址:http://www.cnblogs.com/shanymen/p/4814428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!