设计模式系列漫谈 - 圣诞专题

本文通过一个程序员的视角,讲述了如何利用不同的设计模式来处理圣诞节的各种活动安排,包括向朋友们发送祝福、挑选礼物等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   值此圣诞节来临之际,观察者小姐 策略小姐 装饰小姐 迭代器小姐 代理小姐 职责链小姐祝全国人民圣诞节快乐!!

 

 

public   class  Client
{
      
public   static   void  Main()
      { 
            Console.WriteLine(
" 祝圣诞节快乐 " );
      }
}


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       我一直在杭州工作,猛一回头都快8年。同事,同学,生意上的合作伙伴,朋友交了不少。我想,他们这个时候他们一定在撮骂我,李华星这小子太不够意思了,圣诞节来了,也不表示一下。等等,正准备着呢······

public   interface  IFriend
{
      
void  Say();
}
public   class  Fellow : IFriend
{
      
private   string  _Name;
      
public  Fellow( string  name)
      {
            
this ._Name = value;
      }
      
public   void  Say()
      {
            Console.WriteLine(
this ._Name + " ,在下祝你圣诞节快乐 " );
      }
}
public   class  Classmate : IFriend
{
      
private   string  _Name;
      
public  Classmate( string  name)
      {
            
this ._Name = value;
      }
      
public   void  Say()
      {
            Console.WriteLine(
this ._Name + " ,在下祝你圣诞节快乐 " );
      }
}
public   class  Partner : IFriend
{
      
private   string  _Name;
      
public  Partner( string  name)
      {
            
this ._Name = value;
      }
      
public   void  Say()
      {
            Console.WriteLine(
this ._Name + " ,在下祝你圣诞节快乐 " );
      }
}
public   class  Mobile
{
         
private  ArrayList friends =   new  ArrayList();
         
public   void  Add(IFriend f)
         {
              friends.Add(f)
         }
         
private   void  SayBless()
        {
            
for  ( int  i  =   0 ; i  <  friends.Count; i ++ )
            {
                 IFriend friend
= (IFriend )friends[i];
                 friend.Say();
            }
        }
}



public   class  Client

{

      
public   static   void  Main()

      { 

            Mobile mobile
= new  Mobile();
            mobile.Add(
new  Fellow( " 许小丹 " ));
            mobile.Add(
new  Classmate( " 谢春晖 " ));
            mobile.Add(
new  Partner( " 刘协伟 " ));

            mobile.SayBless();

      }

}
// 此为观察者模式

 

       3月起,我担任公司技术总监一职。经过近一年的努力,整个公司的技术团队已经慢慢壮大,公司技术实力已经逐渐走上成熟。在这里,我要感谢所有与我一起工作、一起奋斗的同事们。另外,我还要感谢我的老婆一年来对我工作的支持,感谢我的特别可爱的宝贝儿子,感谢所有关心我的人······

public   interface  IPeople
{
      
void  Say();
}
public   class  Fellow : IPeople
{
      
public   void  Say()
      {
            Console.WriteLine(
" 感谢大家对我工作的支持,祝圣诞节快乐 " );
      }
}
public   class  Wife: IPeople
{
      
public   void  Say()
      {
            Console.WriteLine(
" 亲爱的,你辛苦了,祝圣诞节快乐,永远爱你 " );
      }
}
public   class  Son: IPeople
{
      
public   void  Say()
      {
            Console.WriteLine(
" 宝贝,爸爸祝你圣诞节快乐,永远开心 " );
      }
}
public   class  SayContext
{
        IPeople _people
=   null ;
        
public   void  SetStrategy(IPeople  people)
        {

            
this ._people =  people;
        }
        
public   void  Say()
        {
            
return   this ._people.Say();
        }
}
public   class  Client
{
      
public   static   void  Main()
      {
            SayContext context
= new  SayContext();
            
            context.SetStrategy(
new  Fellow());
            context.Say(); 

            context.SetStrategy(
new  Wife());
            context.Say();
           
            context.SetStrategy(
new  Son());
            context.Say();
      }

}
// 此为策略模式

 

   男人给女人送花一般会选择玫瑰。但是我老婆不喜欢玫瑰,她喜欢百合,她对我说百合是象征着纯洁的爱情。说来惭愧,记得最后一次给我妻子送百合还是她三年前的生日,后来也没送她什么礼物了,为此,她不时拿这个来说事儿。这次,我希望向妻子表示感谢的同时,我想给她送上一束百合花,宝贝儿子不能落下,给他送个玩具警车(我儿子特别喜欢车)。

public   interface  IPeople
{
      
void  Say();
}

public   interface  IGift
{
     
void  Send();
}

public   class  Wife: IPeople
{
      
public   void  Say()
      {
            Console.WriteLine(
" 亲爱的,你辛苦了,祝圣诞节快乐,爱你的华星 " );
      }
}

public   class  Son: IPeople
{
      
public   void  Say()
      {
            Console.WriteLine(
" 宝贝,爸爸祝你圣诞节快乐 " );
      }
}

public   class  Flower: IGift
{
      
public   void  Send()
      {
            Console.WriteLine(
" 百合花 " );
      }
}

public   class  Toy: IGift
{
      
public   void  Send()
      {
            Console.WriteLine(
" 玩具警车来了 " );
      }
}

public   abstract   class  PeopleDecorator:IPeople
{
       
private  IPeople _people;
       
public  IPeople people
       {
          
get { return  _people;}
       }

       
public  PeopleDecorator(IPeople p)
       {
          
this ._people = p;
       }

       
public   virtual   void  Say()
       {
           _people.Say();
       }
}

public   class  GiftPeopleDecorator:PeopleDecorator
{
       
private  IGift _gift;
       
public  ISound gift
       {
          
get { return  _gift;}
          
set {_gift = value;}
       }

       
public  GiftPeopleDecorator(IPeople p): base (p)
       {
       }

       
public   override   void  Say()
       {
              _gift.Send();
              
base .Say();
       }
}

public   class  Client
{
      
public   static   void  Main()
      { 
            GiftPeopleDecorator gp
= new  GiftPeopleDecorator( new  Wife());
            gp.IGift
= new  Flower();
            gp.Say();

            gp
= new  GiftPeopleDecorator( new  Son());
            gp.IGift
= new  Toy();
            gp.Say();

      }

}}
// 此为装饰模式


     
     
一切准备就绪。全国人民也祝了,朋友也表示了,老婆儿子也感谢了,还有送了礼物。
      我怎么办呢?忘了告诉大家一件事情,知道为什么我这么多年没给我老婆送礼物吗?一方面是我工作确实很忙,没提前准备好。等真要送礼物那天,都来不及了。更重要的原因是我们两地分居,想送也送不了,真是可怜。在此,望老婆大人见谅。
      看来忙完这个,真的没事干吗? 我得再整出点事来。明天圣诞节总不能又去吃快餐吧,有没有哪个朋友有空请我吃饭啊? 我马上得逐个问一下。

public   interface  IFriend
{
      
bool  HasFree();
 }
public   class  FriendA: IFriend
{
      
private   string  _Name;
      
public  FriendA( string  name)
      {
            
this ._Name = value;
      }
      
public   bool  HasFree()
      {
            Console.WriteLine(
this ._Name + " 回家陪老婆去 " );
            
return   false ;
      }
}
public   class  FriendB: IFriend
{
      
private   string  _Name;
      
public  FriendB( string  name)
      {
            
this ._Name = value;
      }
      
public   bool  HasFree()
      {
            Console.WriteLine(
this ._Name + " 回家陪老妈去 " );
            
return   false ;
      }
}
public   class  FriendC: IFriend
{
      
private   string  _Name;
      
public  FriendC( string  name)
      {
            
this ._Name = value;
      }
      
public   bool  HasFree()
      {
            Console.WriteLine(
this ._Name + " 晚上要跟女朋友Happy去哦 " );
            
return   false ;
      }
}
public   interface  IListIterator
{
           
void  First();
           
void  Last();
           
bool  MovePrevous();
           
bool  MoveNext();
           
object  Current{ get ;}
 }
public   class  FriendList : IListIterator
 {
           
private  ArrayList friends =   new  ArrayList; // 子对象列表
            private   int  index =- 1 ;
           
public  FriendList ()
           {
               
           }
           
// 添加子对象
            public   void  Add(IFriend f)
           {
               friends.Add(f);
           }
           
public   void  RemoveBoy(IFriend f)
           {
               friends.Remove(f);
               index
-- ;
           }
           
public   void  First()
           {
               index
= 0 ;
           }
           
public   void  Last()
           {
               index
= boys.Count;
           }
           
public   bool  MovePrevious()
           {
               index
-- ;
               
return  index >- 1 ;
           }
           
public   bool  MoveNext()
           {
               index
++ ;
               
return  index < friends.Count;
           }
           
public   object  Current
           {
               
get  { return   this .friends[index];}
           }
}



public   class  Client

{

      
public   static   void  Main()

      { 

            IListIterator iterator
= new  FriendList();
            iterator.Add(
new  FriendA( " 谢春晖 " ));           
            iterator.Add(
new  FriendB( " 许小丹 " )); 
            iterator.Add(
new  FriendC( " 刘有发 " ));
            iterator.Add(
new  FriendC( " 闵现瑞 " ));

            
while  (iterator.MoveNext())
            {
                   IFriend friend
= (IFriend )iterator.Current;
                  
if  (friend.HasFree())
                      Console.WriteLine(
" 今天晚上终于有着落了 " );
            }


      }

}}
// 此为迭代器模式


      
我晕!?,忙了半天,连一顿饭都没着落。算了,还是继续到楼下阿姨那里吃快餐去,呜。。。呜。。。。吃完快餐,继续折腾我我的Design Parttern。我也不想问再问其他朋友有没有空请我吃饭了,也不一一单独祝福这些朋友。但是,朋友还要问候一下的。全部默认 " 圣诞节快乐!",除非遇到我以前的初恋情人。

public   abstract  Friend
{
         
public   bool   isFirstLover = false ;
         
public   string  strBless = "" ;
         
public   virtual   void  Say()
         {
                Console.WriteLine(strBless);
         }
}
public   class  GoodFriend: Friend
{
      
public   override   void  Say()
      {
            
base .Say();            
      }
}
public   class  ProxyGoodFriend: Friend
{
      
private  GoodFriend _gf;
      
public  ProxyGoodFriend(GoodFriend gf)
      {
            
this ._gf = gf;
      }
      
public   override   void  Say()
      {
            
if  ( base .isFirstLover)
                  
this ._gf.Say();
            
else
                  
base .Say();            
      }
}
public   class  Mobile
{
         
private  ArrayList friends =   new  ArrayList();
         
private   string  _defaultBless;

         
public  Mobile( string  defaultBless)
         {
               
this ._defaultBless = defaultBless;
         }
         
public   void  Add(IFriend f)
         {
              friends.Add(f)
         }

         
private   void  SayBless( bool  isFirst)
        {
            
for  ( int  i  =   0 ; i  <  friends.Count; i ++ )
            {
                  IFriend friend
= (IFriend )friends[i];
                  friend.isFirstLover
= isFirst;
                  friend.strBless
= this ._defaultBless;
                  friend.Say();
            }
        }

        
// 当是初恋情人
         public   void  OnCheck()
        {
             
this ._defaultBless = " 你在他乡还好吗? " ;
             Notify(
true );
        }
}



GoodFriend gf
= new  GoodFriend();

Mobile mobile
= new  Mobile( " 圣诞节快乐! " )
mobile.AddBoy(gf);}
// 此为代理模式



一旦是初恋情人,就mobile.OnCheck(); 千万别被我老婆知道了!:)

   过个圣诞节真够累的。过几天又是元旦,再过一个多月春节又来了,元宵,情人节,端午,儿童节,中秋...... 为了下次过节轻松一点,我的提前准备一下。
   对于节日,我认为至少有两点不同。一是不同的节日有不同时间,有些是阳历,有些是阴历;二是不同节日有不同庆祝方式。再者,节日是年复一年,不断循环。想知道今天是什么节日吗?想知道用什么方式庆祝吗?下面我们来解决这个问题。

public   abstract   class  Festival
{
   
protected  Festival _festival;
   
public   void  SetFestival(Festival festival)
   {
      
this ._festival  =  festival;
   }
   
public   abstract   string  Celebrate( string  strDate, string  strBless);
}

public   class  Solar:Festival  // 阳历
{
   
public   override   string  Celebrate( string  strDate, string  strBless);
   {
      
if  (System.DateTime.Now.Date.ToString( " MM月dd日 " ) == strDate)
      {
         Console.WriteLine(strBless);
      }
      
else
      {
         
if base ._festival  !=   null  )
            
base ._festival.Celebrate(strDate,strBless);
      }
   }
}

public   class  Lunar:Festival  // 阴历
{
   
public   override   string  Celebrate( string  strDate, string  strBless);
   {
      
// ChineseCalendarInfo阴历阳历互相转化的类,实现方法请见键盘敲击者cncxz中的 一个阴历阳历互相转化的类(c#源码) 

      ChineseCalendarInfo ccInfo
=   new  ChineseCalendarInfo(System.DateTime.Now.Date);

      
if  (ccInfo.LunarMonthText + " " + ccInfo.LunarDayText + " " == strDate)
      {
         Console.WriteLine(strBless);
      }
      
else
      {
         
if base ._festival  !=   null  )
            
base ._festival.Celebrate(strDate,strBless);
      }
   }
}

public   class  Client
{
  
public   static   void  Main()
  {
    Festival f1 
=   new  Solar();
    Festival f2 
=   new  Lunar();
    f1.SetFestival(f2);
    
    
string [] aryDate = { " 12月25日 " , " 一月一日 " , " 02月14日 " , " 五月五日 " , " 八月十五日 " };
    
string [] aryCelebration = { " 圣诞节快乐 " , " 新年好 " , " 愿天下有情人终成眷属 " , " 端午节别忘了吃棕 " , " 中秋团圆 " };


    
for ( int  i = 0 ;i < aryDate.Length;i ++ )
       h1.SendBless(aryDate[i],aryCelebration[i]);
  }
}}
// 此为职责链模式



圣诞专题到此结束,本想继续, 太晚了,明天还得上班. 感谢各位阅读,不妥之处,若您忍不住想砸砖,看在圣诞爷爷的份上,请轻点,顺祝各位工作顺利,圣诞节快乐。最后,由于引用了以下两名作者大作内容,特此表示感谢。

伍迷家园         键盘敲击者cncxz

转载于:https://www.cnblogs.com/ruochen/archive/2007/12/24/1012933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值