2017

在实质上编程中,会时时碰着两个类中的某些方法实现逻辑类似的图景,这时大家得以将这么些类中的相同部分虚幻到父类中,对于有差距的地点,子类按照自家的实在需求来分别实现。
以羽毛球活动为例,打球必有发接发环节,发球分正手和反手二种(这里不探究羽球技术细节),一般男单反相机手发球,女单正手发球,但发接发这几个环节的流水线是同一的。

各样人都命不久矣,愿自己能变成自己的勇于。

葡京注册送188 1

葡京注册送188 2

2013 年世锦赛

2017这一年,过得无比之连忙。

abstract class Badminton
{
    public abstract void Serve();

    public abstract void Catch();

    public abstract void Play();
}

class MenSingle : Badminton
{
    public override void Serve()
    {
        Console.WriteLine("反手发球......");
    }

    public override void Catch()
    {
        Console.WriteLine("正手推底线");
    }

    public override void Play()
    {
        Serve();
        Catch();
    }
}


class WomenSingle : Badminton
{
    public override void Serve()
    {
        Console.WriteLine("正手发球.......");
    }

    public override void Catch()
    {
        Console.WriteLine("软压一拍");
    }

    public override void Play()
    {
        Serve();
        Catch();
    }
}

1月到位了第一次小学体育的教授资格证面试,办了第一张健身卡,第三遍染头发,开头了人生中作为学生最后一个寒假,过年。

次第开发中有个紧要的准绳:Don't repeat yourself。而地方一段代码中,子类MenSingleWomenSingle中的Play办法是再度的,羽毛球运动除男单、女单外还有男双,女双,混双,如此则代码中最少五处重复,这显然不便民日后维护。
接下去对代码举行改良:

五月和奶奶一起去看四月十五的龙灯,去学校报到当天就回了家,去实习的中学发放了舆论的考察问卷,完成了杂文初稿,最终一天抽到第一个SSR。

abstract class Badminton
{
    protected abstract void Serve();

    protected abstract void Catch();

    public void Play()
    {
        Serve();
        Catch();
    }
}

class MenSingle : Badminton
{
    protected override void Serve()
    {
        Console.WriteLine("反手发球......");
    }

    protected override void Catch()
    {
        Console.WriteLine("正手推底线");
    }

}


class WomenSingle : Badminton
{
    protected override void Serve()
    {
        Console.WriteLine("正手发球.......");
    }

    protected override void Catch()
    {
        Console.WriteLine("软压一拍");
    }

}

十二月在家准备小学数学的教职工招聘考试,出席了初中体育的良师资格证笔试,知道教授资格证面试不合格,伊始做纸雕。

这段代码将Play措施放到父类中实现,对于有异样的ServeCatch则交有子类实现,这边是模板方法格局,装进不变部分,增添可变部分。其中Play主意称之为模板方法ServeCatch称为主旨措施
一般性模板方法(可以有两个)在父类中贯彻并调用基本办法以成功一定的逻辑,且不同意子类重写。
主干方法一般为架空方法,由子类来形成具体的兑现。基本措施的访问修饰符平常是protected,不需要对外界展露(迪米特法则),客户端只需要调用模板方法即可。

三月在家吃了阿姨婆做的青团,回学校,改了5稿依然6稿的舆论,初中老师资格证笔试通过报名了面试,第一次看电影首映礼(喜欢您)看到了睢晓雯本人,第一次去奥马哈看了游春戏坐了乌篷船和好情人一道,论文定稿,参预毕业答辩拍了毕业照,月首和家人一道去了金华游。

这就是说,问题来了,世界羽联没有规定男单必须用反手发球,女单必须正手发球。假设男单想用正手发球如何做?为适应这种颇具多种也许的情状,咱们对代码稍作调整:

十一月尾先次自行车骑了12公里,下定狠心要在底特律做事丢弃了当老师,穿了胸罩化了妆蹬了一双小白鞋拿着简历去了4次面试,拒绝了第两次面试时拿到的offer,在第五遍面试停止的时候接受了offer,正式启幕每天6点半起床做一个半时辰的公交去上班做了一名猎头,第一回收到节礼,第一次插足合作社活动和共事起先创制牢固的情丝。

abstract class Badminton
{
    private  void ForehandServe()
    {
        Console.WriteLine("正手发球.......");
    }

    private void BackhandServe()
    {
        Console.WriteLine("反手发球......");
    }

    protected abstract void Catch();

    protected abstract bool IsForeHandServe { get; }

    public void Play()
    {
        if (IsForeHandServe)
        {
            ForehandServe();
        }
        else
        {
            BackhandServe();
        }
        Catch();
    }
}

class MenSingle : Badminton
{
    protected override bool IsForeHandServe => false;

    protected override void Catch()
    {
        Console.WriteLine("正手推底线");
    }
}


class WomenSingle : Badminton
{
    protected override bool IsForeHandServe => true;

    protected override void Catch()
    {
        Console.WriteLine("软压一拍");
    }
}

二月第一次发工钱,起初独立做单,身边关系好的同事离职了,第一次做不织布的手工,初中体育的教授资格证面试合格收到了讲师资格证合格证书,穿了研究生服和姨妈一块参与了毕业典礼正式毕业,收到三姨给的结业礼物,身边第一个朋友怀孕了,和业主同事共同去打羽毛球的时候崴了脚,开端喝中药,起先知道社会的求实和虚假。

这里,大家通过在子类中实现属性IsForehandServe葡京注册送188,来决定父类中切实调用ForehandServe形式依旧调用BackhandServe方法。属性IsForehandServe称为钩子函数,按照钩子函数的两样实现,模板方法可以有不同的实施结果,即子类对父类爆发了影响。

11月在座了Taobao造物节和好对象一起,第一次抓娃娃花了两百多抓了一个大的一个小的,第一次插手角色扮演推理游戏,做成了第一个单子接到候选人第一个offer,起始了解了人性的摇摇欲坠。

如上,是一个模板方法的杜撰使用意况。模板方法模式有个很关键的特色:父类控制流程,子类负责具体细节的贯彻。这里有没有联想到IoC(控制反转)?IoC的兑现模式有多种,DI只是中间之一,模板方法形式也得以。

四月和情人去吃火锅一口气吃了六七根白糖冰棒,第一次做了陶艺,第一次和谐一个人去餐厅就餐,腊八收到商家和朋友给的红包,对少数人的感觉到从欣赏变成了厌烦,停止了喝中药的浓厚旅程,因为健康验血查出目的不正规,最终一天聚餐喝多了大哭。

不少框架(如:ASP.NET
MVC)也是其一套路,框架定义一套流程,然后由不同的类负责不同功能的落实,并留下扩大点让开发人员可依照实际需求举行扩充开发,但所有框架的处理流程开发人士是控制不了的。

五月集团团队一同去四川自驾游一周,第一次探望沙漠第五次骑骆驼第一次高反,旅行的末梢一天手机坏了,起始欣赏老万,买了小电驴每一日骑车上下班,首次到位对象的喜酒,第一次去玩密室逃脱和同事共同,最终一天搭顺风车回家原本五个钟头的车程因为堵车开了多少个多钟头。

小结

模板方法格局有以下优点:
1、封装不变部分,增加可变部分;

写程序就因该是这样,不仅仅是在模板方法形式中

2、提取公共部分福利日后保障;

Ctrl + C,Ctrl + V 大法好,但滥用也是可怜的

3、父类控制流程,子类负责兑现;

如此,子类便可通过扩张的方法来充实效益;
还要,对于一些繁杂的算法,大家可以前几天父类的沙盘方法中定义好流程,然后再在子类中去落实,思路上也会清楚不少;

五月率先次过节给亲朋好友买节礼,办了健身年卡每礼拜二遍游泳,丢了新买的罪名,集团活动去同事家吃了火锅。

结语

末段,附一段使用模板方法格局写的分页查询代码:

public class DbBase
{
    public virtual string TableName
    {
        get
        {
            throw new NotImplementedException($"属性:{nameof(TableName)}不得为空!");
        }
    }

    protected virtual string ConnectionString
    {
        get
        {
            throw new NotImplementedException("属性:" + nameof(ConnectionString) + "不得为空!");
        }
    }

    protected SqlConnection CreateSqlConnection()
    {
        return CreateSqlConnection(ConnectionString);
    }

    protected SqlConnection CreateSqlConnection(string connnectionString)
    {
        SqlConnection dbConnection = new SqlConnection(connnectionString);
        if (dbConnection.State == ConnectionState.Closed)
        {
            dbConnection.Open();
        }
        return dbConnection;
    }

public interface IPagingQuery<T>
    where T : class
{
    /// <summary>
    /// 数据总量
    /// </summary>
    int DataCount { get; }

    /// <summary>
    /// 分页查询
    /// </summary>
    /// <param name="pageNumber">页码</param>
    /// <param name="pageSize">每页数据量</param>
    /// <returns></returns>
    IEnumerable<T> PagingQuery(int pageNumber, int pageSize);
}

public abstract class PagingQueryDalBase<T> : DbBase, IPagingQuery<T>
    where T : class
{
    public int DataCount => GetDataCount();

    /// <summary>
    /// 查询数据总数SQL
    /// </summary>
    protected abstract string QueryDataCountSql();

    private int GetDataCount()
    {
        int dataCount;
        using (SqlConnection sqlConnection = base.CreateSqlConnection())
        {
            string sql = QueryDataCountSql();
            dataCount = sqlConnection.QueryFirstOrDefault<int>(sql);
        }
        return dataCount;
    }

    /// <summary>
    /// 分页查询SQL
    /// </summary>
    protected abstract string PagingQuerySql(int pageNumber, int pageSize);

    public IEnumerable<T> PagingQuery(int pageNumber, int pageSize)
    {
        if (pageNumber - 1 < 0)
        {
            throw new ArgumentException("参数:pageNumber不得小于1");
        }

        if (pageSize <= 0)
        {
            throw new ArgumentException("参数:pageNumber必须大于0");
        }
        IEnumerable<T> result;
        using (SqlConnection sqlConnection = CreateSqlConnection())
        {
            string sql = PagingQuerySql(pageNumber, pageSize);
            result = sqlConnection.Query<T>(sql);
        }
        return result;
    }
}

十一月和初恋去逛了西湖,买了一只新口红,第一次拿到成单奖金,买了音乐节的票去看老万结果音乐节撤消了,双十一买了600多块钱,第一次租房子开始新生活,和好朋友共同过生日。

1一月左眼肿出了宏观的双眼皮到现在还没消,第两回去做饼干,和同事一起在铺子吃火锅看恐怖片,双十二买了1000多块钱,第一次相亲因为和对方聊不来拒绝了结果对方嫌我太高,第一次在店堂加班大半天,和同事一起买了同等的马夹一起过了圣诞节接受了礼金,放假前公司活动打扫卫生在会议室吃火锅,放假,在榜姐的网易下留言有第三者给本人唱了自身想听的歌。

毕业典礼这天来了小姑妈拍得了业照后疼到不行提前先走了,没有在场毕业晚会和聚餐,后来有收到往日带过大家的指点员和师资给我发的音讯,突然就认为人生好像就缺了点什么补不回去了。

自己还记得看牙验血查出某个目的太高,然后又去大医院抽了几许次血做了累累反省,这次不是自己首先次一个人去医院,可是本人最难过的五次,医务卫生人员提议我住院,我不知情要肿么办,仍旧拔取了回家吃药,去取药的时候自己坐在药房门口哭了很久。

供销协会队长途游去了江苏自驾游,和同事一起是第一次,自驾游是首先次,安徽也是首先次,我和此外多少个差不大的女人一起坐后座,一路上都是哇哇哇的动静,要不就是看看看,要不就是拍拍拍,随手拍的照片都很为难,这种在硝烟弥漫的中途飞驰的感到很好,看到沙漠和草地的愉悦,看到莫高窟的撼动,我的高反是团体里相比较严重的,我大旨是地处下车嗨上车瘫的情状,前几天也是唯一出了这趟远门。

新兴买了小电驴从家里到铺子也要贴近一个时辰的里程,有少数次傍晚突击完回家开着开着感觉自己要睡着,上班的时候给候选人打电话通常被骂,偶尔打到一个对讲机人选态度很好自身都会心满意足很久,有段时间因为找不到简历推荐不出去人压力大到整晚整晚睡不着。

办事之后给家里人打电话的效能越来越少,有段时间每一次给四姨打电话的时候几乎都在口角,挂了对讲机就蹲在路边哭,哭完了再回家。

这一年做了广大控制,有庆幸的也有忏悔的,经历了众多第一次,从学生到上班族的浮动,初始看领会了这些社会的多多无奈。我还记得2016年的最终一天我还在老家的中学实习,收到了很多姑娘给本人的礼品,二零一九年仿佛是我第一次一个人跨年,自己搞了点火锅,开了瓶起泡酒,现在已经躺在被窝里在看跨年直播了。我接近变得尤其孤独,也愈发独立,我仿佛丢了点什么,又找到了点什么,我接近忘记了好多事物,和重重千古说了再见,我或许不同等了,也说不定仍旧一样的。不管什么2017总算要终结了,尽管自己或者没想好将来的自我要成为一个如何的人,二〇一九年回忆最深的是有情人跟自家说的一句话——我们各种人都命不久矣,所以指望2018自己能再变得好一些,对协调也坦诚一些,去做和好想做的业务,坚韧不拔做团结要做的业务,愿自己能成为团结的英雄。

2017再见,2018你好。