zoukankan      html  css  js  c++  java
  • 四、集合与泛型、委托与事件-----《大话设计模式》

    一、集合与泛型

      数组 集合(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; } 
      } 
    } 
  • 相关阅读:
    存储过程与事务实现转账
    win7创建虚拟无线网络
    .net制作安装包 如何生成快捷方式
    安装EFCodeFirst失败。。。。
    用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
    Java struts2
    Java spring
    Java web
    传输层
    xml
  • 原文地址:https://www.cnblogs.com/shanymen/p/4814428.html
Copyright © 2011-2022 走看看