现在的位置: 首页 > 综合 > 正文

单例模式

2013年10月05日 ⁄ 综合 ⁄ 共 3576字 ⁄ 字号 评论关闭
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);
  }
 }
}

抱歉!评论已关闭.