• 踢球时想到的装饰器模式


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

    首先肯定是抽象基类。

        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进攻阵型"显示出来。   

  • 相关阅读:
    Spring+Hibernate集成后事务与Session的一些理解。
    对Spring的一些个人理解
    centos5.8 x86_64安装oracle10g
    C#中MessageBox用法大全(附效果图)
    解决SQL Server管理器无法连接远程数据库的问题
    【sql2000数据库】Named Pipes Provider error 40
    用SQL数据库批量插入数据简介
    DBGridEH在Delphi7中的安装方法及使用说明
    sql server中datetime字段只取年月日如20060421,默认值如何设置?getdate()得到的是包含时分秒的时间。
    获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列
  • 原文地址:https://www.cnblogs.com/darrenji/p/4398359.html
Copyright © 2020-2023  润新知