踢球时想到的装饰器模式_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 踢球时想到的装饰器模式

踢球时想到的装饰器模式

 2015/4/7 16:17:06  Darren Ji  程序员俱乐部  我要评论(0)
  • 摘要:最近踢了场球,9人制比赛,上半场我们采用防守阵型效果不佳,下半场采用进攻阵型取得了比赛的主动。我们上下半场所采取的策略,似乎可以用"装饰器"模式实现一遍。首先肯定是抽象基类。publicabstractclassOurStrategy{publicabstractvoidPlay(stringmsg);}通常,在上半场,我们一般都使用防守阵型。publicclassOurDefaultStategy:OurStrategy{publicoverridevoidPlay(stringmsg)
  • 标签:模式

最近踢了场球,9人制比赛,上半场我们采用防守阵型效果不佳,下半场采用进攻阵型取得了比赛的主动。我们上下半场所采取的策略,似乎可以用"装饰器"模式实现一遍。

 

首先肯定是抽象基类。

 

monospace; width: 100%; margin: 0em; background-color: #f0f0f0">    public abstract class OurStrategy
    {
        public abstract void Play(string msg);
    }

 

通常,在上半场,我们一般都使用防守阵型。

 

    public class OurDefaultStategy : OurStrategy
    {
        public override void Play(string msg)
        {
            Console.WriteLine("上半场4-1-2-1防守阵型");
        }
    }

 

下半场,会根据上半场的态势而调整阵型。也就是需要实现OurStrategy这个抽象类。不过,先不急,我们还得先抽象出一个实现OurStrategy这个抽象类、充当装饰器的一个抽象类。

 

    public abstract class OurDecorator : OurStrategy
    {
        private OurStrategy _ourStrategy;
        public OurDecorator(OurStrategy ourStrategy)
        {
            this._ourStrategy = ourStrategy;
        }
        public override void Play(string msg)
        {
            if (_ourStrategy != null)
            {
                _ourStrategy.Play(msg);
            }
        }
    }

 

以上,这个充当装饰器的抽象类,接收某个实现OurStrategy抽象基类的子类实例,并执行OurStrategy抽象基类的方法Play。

 

接下来,实现OurDecorator这个充当装饰器的类。

 

    public class AttackStategy : OurDecorator
    {
        public AttackStategy(OurStrategy ourStrategy) : base(ourStrategy)
        {
            
        }
        public override void Play(string msg)
        {
            base.Play(msg);
            Console.WriteLine("下半场3-1-3-1进攻阵型");
        }
    } 

       

以上,当然还可以写出很多OurDecorator的派生类。

 

客户端这样调用:

 

    class Program
    {
        static void Main(string[] args)
        {
            OurDecorator ourDecorator = new AttackStategy(new OurDefaultStategy());
            ourDecorator.Play("haha");
            Console.ReadKey();
        }
    }

 

1

 

以上,

○ 通过new AttackStategy(new OurDefaultStategy())把new OurDefaultStategy()实例赋值给类充当装饰墙的抽象基类OurDecorator的_ourStrategy字段。

 

○ 当执行ourDecorator.Play("haha")方法,首先来到AttackStategy的Play方法,执行base.Play(msg),这里的base就是AttackStategy的抽象父类OurDecorator,再执行OurDecorator的Play方法,由于已经给OurDecorator的_ourStrategy字段赋值,_ourStrategy字段存储的是OurDefaultStategy实例,所以,base.Play(msg)最终执行的是OurDefaultStategy的Play方法,即把"上半场4-1-2-1防守阵型"显示出来。

 

○ 最后执行AttackStategy的Play方法中的Console.WriteLine("下半场3-1-3-1进攻阵型")部分,把"下半场3-1-3-1进攻阵型"显示出来。   

发表评论
用户名: 匿名