C#设计模式系列 6 ----State 状态模式 之--电视36计,我要自己掌握遥控器

   1.理论定义

       状态模式  允许 一个对象在其内部 状态改变时, 改变它的行为。

   2.应用举例

          需求描述: 暑期在家里看电视, 正值伦敦奥运会, 今天是星期六,在家里可以偷着乐,看看电视。

                         冰箱开一瓶 王老吉,坐在沙发上,拿起遥控器,一躺, 宅男的一天,又开始了。

                         这么多电视台,提供不同节目,该会是个充实的星期六。

                         大屏幕高清电视打开,我控制遥控器,在各个频道之间傲游.

   3.具体编码

    1.电视节目

    

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// 节目
    /// </summary>
    public  class Item
    {
        /// <summary>
        /// 节目开始时间
        /// </summary>
        public DateTime Start { get; set; }
        /// <summary>
        /// 节目结束时间
        /// </summary>
        public DateTime End { get; set; }
        /// <summary>
        /// 节目名
        /// </summary>
        public string Name { get; set; }
    }
}

2.每个频道 对应的  电视节目单

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// 电视节目单
    /// </summary>
    public class TVSchedule
    {
        /// <summary>
        /// 电视频道名字
        /// </summary>
        public string ChannelName { get; set; }

        /// <summary>
        /// 该电视频道 的 节目单
        /// </summary>
        public List<Item> Schedule { get;set;}
    }
}

3. 电视频道接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// 电视频道接口
    /// </summary>
    public interface IChannel
    {/// <summary>
        /// 电视节目表
        /// </summary>
         TVSchedule TVSchedule { get; set; }
    }
}

4.电视机

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    public class TV
    {
        /// <summary>
        /// 当前播放电视频道
        /// </summary>
        public IChannel Current { get; set; }

        /// <summary>
        /// 播放电视
        /// </summary>
        public void Play() {
           TVSchedule  Schedule =  Current.TVSchedule;
           Console.WriteLine("现在的电视台是:  "+Schedule.ChannelName);
           Console.WriteLine("电视节目单如下:  ");
           foreach (var i in Schedule.Schedule) {
               string start =i.Start.ToString("HH:mm");
               string end = i.End.ToString("HH:mm");
               string name = i.Name;
               Console.WriteLine(start+"--"+end+" 播放 :"+name);
           }
           Console.WriteLine("-------------------------------------------------");
        }
    }
}

5.湖南电视台

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// 湖南电视台
    /// </summary>
    public class HuNan : IChannel
    {
      /// <summary>
        /// 电视节目表
        /// </summary>
        public TVSchedule TVSchedule { get; set; }

    }
}

6.CCTV-5 体育

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// CCTV-5 体育
    /// </summary>
    public class CCTV5 : IChannel
    {
      /// <summary>
        /// 电视节目表
        /// </summary>
        public TVSchedule TVSchedule { get; set; }

    }
}

7. CCTV-10 科教

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Com.Design.Gof.State
{
    /// <summary>
    /// CCTV-10 科教
    /// </summary>
    public class CCTV10 : IChannel
    {
       /// <summary>
        /// 电视节目表
        /// </summary>
        public TVSchedule TVSchedule { get; set; }

    }
}

8.主函数调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Design.Gof.State;
namespace Com.Design.Gof.Test
{
    class Program
    {
       
        static void Main(string[] args)
        {
            // 1.打开电视,默认电视台是湖南卫视
            TV tv = new TV();
            HuNan hunan = new HuNan {TVSchedule = new TVSchedule
            { 
              ChannelName = "湖南卫视",
              Schedule = new List<Item> { 
              new Item{ Name="我们约会吧(重播)", Start=DateTime.Parse("2012-08-04 00:00"), End=DateTime.Parse("2012-08-04 02:00")},
              new Item{ Name="向上吧!少年    ", Start=DateTime.Parse("2012-08-04 02:00"), End=DateTime.Parse("2012-08-04 03:00")},
              new Item{ Name="湖南新闻联播", Start=DateTime.Parse("2012-08-04 07:00"), End=DateTime.Parse("2012-08-04 07:30")},
              new Item{ Name="我们约会吧", Start=DateTime.Parse("2012-08-04 07:30"), End=DateTime.Parse("2012-08-04 08:30")},
              new Item{ Name="电视剧:还珠格格Ⅲ(37)", Start=DateTime.Parse("2012-08-04 08:30"), End=DateTime.Parse("2012-08-04 09:20")},
              new Item{ Name="电视剧:还珠格格Ⅲ(38)", Start=DateTime.Parse("2012-08-04 09:27"), End=DateTime.Parse("2012-08-04 10:25")},
            } } };
            tv.Current = hunan;
            tv.Play();
            //现在遥控器 切换 到  CCTV5 体育频道
            CCTV5 cctv5 = new CCTV5{TVSchedule = new TVSchedule
            {
              ChannelName = "CCTV5",
              Schedule = new List<Item> { 
              new Item{ Name="录像:女子射箭团体决赛", Start=DateTime.Parse("2012-08-04 01:45"), End=DateTime.Parse("2012-08-04 02:50")},
              new Item{ Name="直播:男篮预赛(阿根廷-立陶宛)", Start=DateTime.Parse("2012-08-04 05:15"), End=DateTime.Parse("2012-08-04 07:00")},
              new Item{ Name="早安奥林匹克", Start=DateTime.Parse("2012-08-04 07:00"), End=DateTime.Parse("2012-08-04 07:30")},
              new Item{ Name="奥运风云会", Start=DateTime.Parse("2012-08-04 08:30"), End=DateTime.Parse("2012-08-04 09:00")},
              new Item{ Name="录像:男子举重56公斤级决赛", Start=DateTime.Parse("2012-08-04 09:00"), End=DateTime.Parse("2012-08-04 11:00")},
              new Item{ Name="奥运赛事集锦", Start=DateTime.Parse("2012-08-04 11:00"), End=DateTime.Parse("2012-08-04 12:25")},
             } }};
            tv.Current = cctv5;
            tv.Play();
            //现在遥控器 切换 到  CCTV10 科教
            CCTV10 cctv10 = new CCTV10{  TVSchedule = new TVSchedule
            {
              ChannelName = "CCTV10",
              Schedule = new List<Item> { 
              new Item{ Name="百家讲坛", Start=DateTime.Parse("2012-08-04 12:40"), End=DateTime.Parse("2012-08-04 14:10")},
              new Item{ Name="动物探秘I1", Start=DateTime.Parse("2012-08-04 14:25"), End=DateTime.Parse("2012-08-04 15:00")},
              new Item{ Name="欣赏", Start=DateTime.Parse("2012-08-04 15:07"), End=DateTime.Parse("2012-08-04 16:00")},
              new Item{ Name="奥秘Ⅱ38", Start=DateTime.Parse("2012-08-04 15:12"), End=DateTime.Parse("2012-08-04 16:50")},
              new Item{ Name="探索·发现", Start=DateTime.Parse("2012-08-04 16:00"), End=DateTime.Parse("2012-08-04 16:40")},
              new Item{ Name="自然传奇", Start=DateTime.Parse("2012-08-04 16:45"), End=DateTime.Parse("2012-08-04 17:25")},
              new Item{ Name="茶叶之路22", Start=DateTime.Parse("2012-08-04 20:30"), End=DateTime.Parse("2012-08-04 20:40")},
              new Item{ Name="探索·发现", Start=DateTime.Parse("2012-08-04 20:40"), End=DateTime.Parse("2012-08-04 21:20")},
             } } };
            tv.Current = cctv10;
            tv.Play();
            Console.ReadKey();

        }

    }
}

9.运行结果

10.总结

  想用多线程来操作电视 Play,换台的时候  显示正在播放的电视。 感觉工程也比较大。

  所以就直接打印 电视节目单了。

  附件里面包括了程序源码。

  这里是附件下载(Download)

posted @ 2012-08-04 09:57  正定聚  阅读(1285)  评论(2编辑  收藏  举报