单例模式

来源:互联网 发布:淘宝3大组装电脑卖家 编辑:程序博客网 时间:2024/06/06 01:11
package utils{   public class TimeAlarm {  static private var _instance:TimeAlarm;//使用单例模式  private var _timeSourceFunc:Function;  /**   *闹铃管理器    *    */    public function TimeAlarm()  {   if(_instance!=null)    throw "TimeAlarm is single instance class."  }    static public function get instance():TimeAlarm  {   if(_instance==null)   {    _instance = new TimeAlarm();   }   return _instance;  }  /**   *在帧循环中调用    * @param time   *    */    public function alarmTick(time:Number=NaN):void  {   var date:Date;   var day:int;   if(isNaN(time)==true)   {    date = new Date();   }else{    date = new Date(time);   }      var monthly_key:String = "";   var weekly_key:String = "";   var daily_key:String = "";   //每月 键值   if(date.month<9)   {    monthly_key += "0";   }   monthly_key += String(date.month+1);   if(date.date<10)   {    monthly_key += "0";   }   monthly_key += String(date.date);   //每周 键值   if(date.day==0)   {    monthly_key = monthly_key + "07";    weekly_key = weekly_key + "07";    day = 7;   }else{    monthly_key = monthly_key + "0" + String(date.day);    weekly_key = weekly_key + "0" + String(date.day);    day = date.day;   }   //每时 键值   if(date.hours<10)   {    monthly_key += "0";    weekly_key += "0";    daily_key += "0";   }   monthly_key += String(date.hours);   weekly_key += String(date.hours);   daily_key += String(date.hours);   if(date.minutes<10)   {    monthly_key += "0";    weekly_key += "0";    daily_key += "0";   }   monthly_key +=String(date.minutes);   weekly_key +=String(date.minutes);   daily_key +=String(date.minutes);      if(date.seconds<10)   {    monthly_key += "0";    weekly_key += "0";    daily_key += "0";   }   monthly_key +=String(date.seconds);   weekly_key +=String(date.seconds);   daily_key +=String(date.seconds);      if(_alarms!=null)   {    var type_alarms:Array;    var final_key:String;    for (var type:String in _alarms)    {     type_alarms = _alarms[type];     switch(int(type))     {      case ALARM_WEEKLY:      {       final_key = weekly_key;       break;      }      case ALARM_DAiLY:      {       final_key = daily_key;       break;      }     }     var alarm:Object;     var alarms:Array;     //正点提醒     for (var k:String in type_alarms)     {      alarms = type_alarms[k];      if(k==final_key)      {       for each(alarm in alarms)       {        if(alarm.alarm is Function)        {         alarm.alarm(alarm);         alarm.alarmed = true;        }       }      }else{       for each(alarm in alarms)       {        //超出正点,但是还在范围内        if(alarm.range!=null && alarm.alarmed==false)        {         //先只算周提醒的         if((alarm.w==null || alarm.w==day) && alarm.h==date.hours)//         {          var end_min:int = int(alarm.min)+int(alarm.range);          var start_min:int = int(alarm.min);          var start_s:int = int(alarm.s);          var in_range:Boolean = false;          if(end_min>date.minutes)//结束时间比当前时间晚          {           if(start_min==date.minutes)//如果刚好是开始分数           {            if(start_s<date.seconds)//看看是不是当前时间过了正点            {             in_range = true;            }           }else if(start_min<date.minutes)//如果过了开始分数           {            in_range = true;           }          }else if(end_min==date.minutes)//如果当前时间赶上了结束时间          {           if(start_s>date.seconds)//秒数还在范围内           {            in_range = true;           }          }          if(in_range==true)          {           alarm.alarmed = true;           alarm.alarm(alarm);          }         }        }       }      }     }    }   }  }  private const KEYS:Array = ["m", "d", "w", "h", "min", "s"];  //类型和KEYS里的属性索引是对应的    private const ALARM_WEEKLY:int = 2;//每周  private const ALARM_DAiLY:int = 3;//每日  private var _alarms:Array;  /**   * @param alarm  {m:1~12, d:1~31, w:1~7, h:0~23, min:0~60, s:0~60, range:xx, alarm:call back function } 各自意义 月 日 周(1~7) 时 分 秒    *   range:{min:0<=min<60; s:0<=s<60} 从起始时间开始,指定时间范围内都有效,单位分;alarm:回调函数   *    */    public function addAlarm(alarm:Object):void  {   var alarm_type:int = -1;   //这里的判断要从大到小,比如扩展了每月类型的就要先判断月,顺序依次是 每年>每月>每周>每天   if(alarm.hasOwnProperty("w")==true && alarm.w>0)   {    alarm_type = ALARM_WEEKLY;   }else if(alarm.hasOwnProperty("h")==true)   {    alarm_type = ALARM_DAiLY;   }   if(alarm_type>=0)   {    formatAlarm(alarm, alarm_type);   }  }    private function formatAlarm(alarm:Object, alarmType:int):void  {   var finale_key:String = "";   for(var i:int = alarmType; i < KEYS.length; ++i)   {    var key:String = KEYS[i];    if(alarm[key]!=null)    {     if(alarm[key]<10)     {      finale_key += "0";     }     finale_key += String(alarm[key]);    }else{     finale_key += "00";    }   }   if(_alarms==null)   {    _alarms = new Array();   }   if(_alarms[alarmType]==null)   {    _alarms[alarmType] = new Array();   }   if(_alarms[alarmType][finale_key]==null)   {    _alarms[alarmType][finale_key] = new Array();   }   alarm.alarmed = false;   _alarms[alarmType][finale_key].push(alarm);  } }}

原创粉丝点击