[绘画]新涂的权利游戏

[文章]从ReactiveCocoa中能学到什么?不用此库也能学以致用

从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveCocoa这种完全按FRP编写的库没能够流行起来这个问题。对这个问题的回答一般都是门槛高,解决方法就是培训和通过熟悉以前的代码来快速入门。其实在我学习的过程中也发现确实会有这个问题,不过就算是有这样那样问题使得ReactiveCocoa这样的库没法大面积使用起来,也不能错失学习这种编程思想的机会。

如果不用这样的库,能不能将这种库的编程思想融入项目中,发挥出其优势呢?答案是肯定的。

FRP全称Function Reactive Programming,从名称就能够看出来这个模型关键就是Function Programming和Reactive Programming的结合。那么就先从函数式编程说起。说函数式编程前先聊聊链式编程,先看看一个开源Alert控件的头文件里定义的接口方法的写法。

/*
 *  自定义样式的alertView
 *
 */
+ (instancetype)showAlertWithTitle:(NSString *)title
                           message:(NSString *)message
                        completion:(PXAlertViewCompletionBlock)completion
                       cancelTitle:(NSString *)cancelTitle
                       otherTitles:(NSString *)otherTitles, ... NS_REQUIRES_NIL_TERMINATION;

/*
 * @param otherTitles Must be a NSArray containing type NSString, or set to nil for no otherTitles.
 */
+ (instancetype)showAlertWithTitle:(NSString *)title
                       contentView:(UIView *)view
                       secondTitle:(NSString *)secondTitle
                           message:(NSString *)message
                       cancelTitle:(NSString *)cancelTitle
                       otherTitles:(NSArray *)otherTitles
                          btnStyle:(BOOL)btnStyle
                        completion:(PXAlertViewCompletionBlock)completion;

库里还有更多这样的组合,这么写是没有什么问题,无非是为了更方便组合使用而啰嗦了点,但是如果现在要添加一个AttributeString,那么所有组合接口都需要修改,每次调用接口方法如果不需要用Attribuite的地方还要去设置nil,这样会很不易于扩展。下面举个上报日志接口的例子。

@interface SMLogger : NSObject
//初始化
+ (SMLogger *)create;
//可选设置
- (SMLogger *)object:(id)obj;                        //object对象记录
- (SMLogger *)message:(NSString *)msg;               //描述
- (SMLogger *)classify:(SMProjectClassify)classify;  //分类
- (SMLogger *)level:(SMLoggerLevel)level;            //级别

//最后需要执行这个方法进行保存,什么都不设置也会记录文件名,函数名,行数等信息
- (void)save;

@end

//宏
FOUNDATION_EXPORT void SMLoggerDebugFunc(DCProjectClassify classify, DCLoggerLevel level, NSString *format, ...) NS_FORMAT_FUNCTION(3,4);
//debug方式打印日志,不会上报
#define SMLoggerDebug(frmt, ...) 
do { SMLoggerDebugFunc(SMProjectClassifyNormal,DCLoggerLevelDebug,frmt, ##__VA_ARGS__);} while(0)
//简单的上报日志
#define SMLoggerSimple(frmt, ...) 
do { SMLoggerDebugFunc(SMProjectClassifyNormal,SMLoggerLevelDebug,frmt, ##__VA_ARGS__);} while(0)
//自定义classify和level的日志,可上报
#define SMLoggerCustom(classify,level,frmt, ...) 
do { SMLoggerDebugFunc(classify,level,frmt, ##__VA_ARGS__);} while(0)

从这个头文件可以看出,对接口所需的参数不用将各种组合一一定义,只需要按照需要组合即可,而且做这个日志接口时发现后续维护过程中会增加越来越多的功能和需要更多的input数据。比如每条日志添加应用生命周期唯一编号,产品线每次切换唯一编号这样需要在特定场景需要添加的input支持。采用这种方式会更加易于扩展。写的时候会是[[[[DCLogger create] message:@"此处必改"] classify:DCProjectClassifyTradeHome] save]; 这样,对于不是特定场所较通用的场景可以使用宏来定义,内部实现还是按照前者的来实现,看起来是[DCLogger loggerWithMessage:@"此处必改"];,这样就能够同时满足常用场景和特殊场景的调用需求。

有了链式编程这种易于扩展方式的编程方式再来构造函数式编程,函数编程主要思路就是用有输入输出的函数作为参数将运算过程尽量写成一系列嵌套的函数调用,下面我构造一个需求来看看函数式编程的例子。

typedef NS_ENUM(NSUInteger, SMStudentGender) {
    SMStudentGenderMale,
    SMStudentGenderFemale
};

typedef BOOL(^SatisfyActionBlock)(NSUInteger credit);

@interface SMStudent : NSObject

@property (nonatomic, strong) SMCreditSubject *creditSubject;

@property (nonatomic, assign) BOOL isSatisfyCredit;

+ (SMStudent *)create;
- (SMStudent *)name:(NSString *)name;
- (SMStudent *)gender:(SMStudentGender)gender;
- (SMStudent *)studentNumber:(NSUInteger)number;

//积分相关
- (SMStudent *)sendCredit:(NSUInteger(^)(NSUInteger credit))updateCreditBlock;
- (SMStudent *)filterIsASatisfyCredit:(SatisfyActionBlock)satisfyBlock;

@end

这个例子中,sendCredit的block函数参数会处理当前的积分这个数据然后返回给SMStudent记录下来,filterIsASatisfyCredit的block函数参数会处理是否达到合格的积分判断返回是或否的BOOL值给SMStudent记录下来。实现代码如下

    //present
    self.student = [[[[[SMStudent create]
                       name:@"ming"]
                      gender:SMStudentGenderMale]
                     studentNumber:345]
                    filterIsASatisfyCredit:^BOOL(NSUInteger credit){
                        if (credit >= 70) {
                            self.isSatisfyLabel.text = @"合格";
                            self.isSatisfyLabel.textColor = [UIColor redColor];
                            return YES;
                        } else {
                            self.isSatisfyLabel.text = @"不合格";
                            return NO;
                        }

                    }];

    @weakify(self);
    [[self.testButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        @strongify(self);

        [self.student sendCredit:^NSUInteger(NSUInteger credit) {
            credit += 5;
            NSLog(@"current credit %lu",credit);
            [self.student.creditSubject sendNext:credit];
            return credit;
        }];
    }];

    [self.student.creditSubject subscribeNext:^(NSUInteger credit) {
        NSLog(@"第一个订阅的credit处理积分%lu",credit);
        self.currentCreditLabel.text = [NSString stringWithFormat:@"%lu",credit];
        if (credit < 30) {
            self.currentCreditLabel.textColor = [UIColor lightGrayColor];
        } else if(credit < 70) {
            self.currentCreditLabel.textColor = [UIColor purpleColor];
        } else {
            self.currentCreditLabel.textColor = [UIColor redColor];
        }
    }];

    [self.student.creditSubject subscribeNext:^(NSUInteger credit) {
        NSLog(@"第二个订阅的credit处理积分%lu",credit);
        if (!(credit > 0)) {
            self.currentCreditLabel.text = @"0";
            self.isSatisfyLabel.text = @"未设置";
        }
    }];

每次按钮点击都会增加5个积分,达到70个积分就算合格了。上面的例子里可以看到一个对每次积分变化有不同的观察者处理的操作代码,这里并没有使用ReactiveCocoa里的信号,而是自己实现了一个特定的积分的类似信号的对象,方法名也用的是一样的。实现这个对象也是用的函数式编程方式。下面我的具体的实现代码

@interface SMCreditSubject : NSObject

typedef void(^SubscribeNextActionBlock)(NSUInteger credit);

+ (SMCreditSubject *)create;

- (SMCreditSubject *)sendNext:(NSUInteger)credit;
- (SMCreditSubject *)subscribeNext:(SubscribeNextActionBlock)block;

@end

@interface SMCreditSubject()

@property (nonatomic, assign) NSUInteger credit;
@property (nonatomic, strong) SubscribeNextActionBlock subscribeNextBlock;
@property (nonatomic, strong) NSMutableArray *blockArray;

@end

@implementation SMCreditSubject

+ (SMCreditSubject *)create {
    SMCreditSubject *subject = [[self alloc] init];
    return subject;
}

- (SMCreditSubject *)sendNext:(NSUInteger)credit {
    self.credit = credit;
    if (self.blockArray.count > 0) {
        for (SubscribeNextActionBlock block in self.blockArray) {
            block(self.credit);
        }
    }
    return self;
}

- (SMCreditSubject *)subscribeNext:(SubscribeNextActionBlock)block {
    if (block) {
        block(self.credit);
    }
    [self.blockArray addObject:block];
    return self;
}

#pragma mark - Getter
- (NSMutableArray *)blockArray {
    if (!_blockArray) {
        _blockArray = [NSMutableArray array];
    }
    return _blockArray;
}

Demo地址:https://github.com/ming1016/RACStudy

主要思路就是subscribeNext时将参数block的实现输入添加到一个数组中,sendNext时记录输入的积分,同时遍历那个记录subscribeNext的block的数组使那些block再按照新积分再实现一次输入,达到更新积分通知多个subscriber来实现新值的效果。

除了block还可以将每次sendNext的积分放入一个数组记录每次的积分变化,在RAC中的Signal就是这样处理的,如下图,这样新加入的subscirber能够读取到积分变化历史记录。

所以不用ReactiveCocoa库也能够按照函数式编程方式改造现有项目达到同样的效果。

上面的例子也能够看出FRP的另一个响应式编程的特性。说响应式编程之前可以先看看我之前关于解耦的那篇文章里的Demohttps://github.com/ming1016/DecoupleDemo,里面使用了Model作为连接视图,请求存储和控制器之间的纽带,通过KVO使它们能够通过Model的属性来相互监听来避免它们之间的相互依赖达到解耦的效果。

像上面的例子那样其实也能够达到同样的效果,创建一个Model然后通过各个Subject来贯穿视图层和数据层进行send值和多subscribe值的处理。

了解了这种编程模型,再去了解下ReactiveCocoa使用的三种设计模式就能够更容易的将它学以致用了,下面配上这三种贯穿ReactiveCocoa的设计模式,看这些图里的方法名是不是很眼熟。

ReactiveCocoa里面还有很多可以学习的地方,比如宏的运用,可以看看sunnyxx的那篇《Reactive Cocoa Tutorial [1] = 神奇的Macros》http://blog.sunnyxx.com/2014/03/06/rac_1_macros/

[小说]《十中》索引

第一话:http://www.starming.com/index.php?v=index&view=92

第二话:http://www.starming.com/index.php?v=index&view=93

第三话:http://www.starming.com/index.php?v=index&view=94

第四话:http://www.starming.com/index.php?v=index&view=95

第五话:http://www.starming.com/index.php?v=index&view=96

[小说]十中 第五话

命运往往都不那么会顺着人意,对凌召是,对丁晓炎也是。

画面终于定在了凌召期待的决赛,这次主场是在一中,上半场王亦和凌召娴熟的配合通过防守反击在快结束时压哨率先取得一分。凌召开心的小跑到场边,看见田晓宁已经准备好毛巾和水正等着他,他接过水,田晓宁满脸笑容深情的望着凌召,凌召想着凭借这一分优势,下半场就能够很容易掌握主动权,胜算将非常大。他打算在胜利后在台上大声说出对丁晓炎鼓励的感激。拿着水正要喝时,忽地感觉有个眼神在另一边看着自己,他放下水杯,往那边看去,那个身影忽地消失在人群中,那身型和发型像极了丁晓炎。

这一定是自己想丁晓炎想得太多了产生的幻觉吧。凌召将水往脸上泼了去,想让自己清醒下。

下半场,十中在最后时刻因为韩霍的冲动红牌下场而陷入被动,最终没能够挡住一中猛烈的攻势。这样凌召因为败落而失去找丁晓炎的勇气。那以后凌召就再也没有见过丁晓炎了。

即使这么多年过去,小学同学聚会上她也没有出现。凌召翻着那篇丁晓炎的文章,文章是这样写的:“

那年,我四年级,转学到一所小学,周围都那么陌生,和我同桌的以为男孩成为了我在这儿的第一个朋友。他叫凌召,我们很谈得来。他送给我一只黄色的电子表,这是我收到的第一个男生的礼物。

快乐的时光总是短暂的,在凌召被调到后面做的那天,放学后,我站在他必经路边的一颗树旁等他。在他经过时我问他不跟我坐是不是不开心,他看起来有些伤心,看也没看我一眼就走了。

自那以后,我常常看见凌召和他的同桌们吵架。一次学校庆典上,凌召来了场钢琴独奏,随着琴声飘荡在我耳边,我发现我已经喜欢上了他。他送给我的那只黄色表我放在抽屉一打开就能够看见的地方,这样我每次打开抽屉就能够回想和他同桌的时光。小女孩的心思就是这样的简单,单纯着,虽然也知道自己对凌召来说只是一个普通的同桌过的人而已,但却也能够勇敢的不顾一切的去享受着这份纯纯的单恋。

我们那个年代没有手机,小学临近毕业那会,同学们都会让自己在乎的人在自己的本子上留下家庭住址联系方式,因为毕业后大家可能会分开去其它的学校。当我把本子给凌召时,他的那些朋友们都这跟着起哄,弄得凌召不好意思的脸都红了,为了让他不尴尬,我让他的那些朋友也都在本子上写了。

上课后,我一直在想为什么就我去找凌召时他的朋友们会起哄,其他女同学去时他们也没什么反应啊,想着想着趴在桌上回头抄凌召坐的方向看去,发现他也正在看着我,我有点惊慌,心跳加速,但视线一直没有离开他,他也没有离开我。我有点不相信,回过神,发现他已经趴在桌上睡着了。

上了初中,我们分在了不同的学校,但因为一个人,让我能再了解到凌召在十中的所有事。这个人算得上是万人迷吧,班上的女生都被他迷得神魂颠倒的,可不知怎么的他就是喜欢我,我都没怎么跟他说过话耶,就是这样,可能一种感觉能让你毫无缘由的喜欢上一个人。这个男孩叫李文龙,在他跟我表白后,我说我已经有喜欢的人了,李文龙看起来有点不服气非要问出那个人是谁。

后来他跟班上一位同学打架劝退后转到了十中凌召的班,虽然转校了,但是因为凌召,他也能够有足够的话题来找我说了,对于我来说我也能够知道更多凌召的事情了。听说凌召加入了足球部,我想这样我就能够在放学后去他们学校看他练球了。

但那次当我在球场边栅栏看时发现一个非常漂亮的女生正在将一封信递给凌召。看着那女孩子不好意思的样子,我想那一定是情书吧。这时发现球场上另一边李文龙正带着一种伤心的眼神看着我。一会凌召也朝我这边看来,我赶紧躲到一旁树后。

后来听说我们一中要跟一中比赛,我想凌召应该也会来参赛,于是我申请了球赛自愿者在场边捡球。这样就能够近距离看见凌召了。开赛前,我在场边做准备,发现凌召跑到观众席和以前小学同学们打着招呼,我有点后悔应该呆在观众席了。比赛时,凌召全神贯注的注视着球场,直到最后他才被换上场,没想到我捡到他唯一的一个球竟是他的乌龙球。那时我离他是那么近,但他双眼已无神,看起来难过极了。

我一直担心着他后来的状况,一直盼着李文龙来找我。但这次李文龙带来的消息是凌召跟班上一个玩音乐的女孩子好上了,我知道凌召是很喜欢音乐的,想着他们一起聊着他们喜爱的音乐幸福的画面,有种难于形容的妒忌涌上心头。

李文龙跟我说不信可以第二天放学后去江滩看看,因为那女孩子给凌召的情书里是约着去那相见的。等我到江滩时看见那女孩正抱着凌召,我心里真的好难受,原本还抱着的一丝侥幸变得绝望。

这样的心情我想会持续很久吧,晚上我无法入睡,枕头全被泪水浸湿。

放学后我好像被一中磁场带动了凌召家旁边的书店。因为这家书店离我家比较远,我很少来。我漫不经心的翻着书架上的书,但脑海里却满是那女孩抱着凌召的画面,想到当时的情景,凌召看起来并不是很开心,他当时没有抱着那女孩。会不会只是那女孩单方面的喜欢呢,想到这里我已拿到新出的伯爵千金来到收银台。有种磁场理论就是对一个事渴望意念足够强就会产生巨大的磁场将那事吸引到身边。这时一个高大的身影出现在我身边。我抬头发现正是我日夜思恋的凌召,他好像没发现我,我跟他打了个招呼,他只是简单的回了句,然后就一直低着头。因为我们已经好久没这样一起过,我不知道他现在对我是怎样的感觉,于是也没有再说什么,在这样的气氛下,凌召不小心的碰到我的手臂,我用余光看见他害羞的脸好红,我胳膊能够感觉到他的颤动,虽然我们没怎么说话,但此时我能感觉他还是小学那会的他,那是种熟悉而难忘的感觉,我好希望能够这样多待会儿,可是凌召好像有些紧张,让我觉得他对我和对其他女生还是不一样的。结完帐,我看凌召好像还没有回过神。

我没法不去想和凌召的这次偶遇,接下来的一天,我没法忍住,在中午先去了十中,希望能够再看看他。来到他的教学楼下,碰到了李文龙,他开始是惊喜的表情,后来可能想到我是来看凌召的才恢复了淡定的神情。他应该也没想到我会这么喜欢凌召,李文龙说给凌召写情书的女孩后来没有跟凌召在一起,看来我的感觉是对的。接着李文龙说他愿意帮我去问问凌召喜欢谁。说可能那个人有可能是我。

听到这,我忽地红起脸来,心中窃喜,口中却连连说不可能。但我又害怕如果那个人不是我,我可能会更加难受。因为太在意所以会害怕,我让李文龙不要问,即使问了也不要跟我说。李文龙不傻,很快看出了我的小心思,他知道我对结果是既期待又惧怕,但是这种事情如果不挑明怎么会有结果呢,我们都知道凌召不是那种主动的人,于是李文龙想了个办法。他说现在凌召球是越踢越好了,如果十中能够获得冠军,他就帮我问,如果凌召喜欢的人是我,他会祝福我们,如果不是,李文龙希望我能够接受他。我没有答应如果那个人不是我就接受李文龙这个条件,心里觉得有些对不起李文龙,我不希望李文龙成为备胎,那样对他不公平,我是真的把他当成很好的朋友,但也只能到这一步。李文龙神情有些恍惚,我想定是我的回答伤了他骄傲的心。

这时,我看见李文龙身后出现了凌召的身影,他不会听到了我和李文龙的对话吧。我一时不知该如何面对,于是匆匆的走开了。

接下来,我就一直期待着足球足球赛的进行和李文龙定期到一中来跟我描述和称赞凌召如何聪明。每每听到凌召的事情我都会很开心,李文龙说他喜欢看到我笑的样子,他也知道是因为他说了很多凌召的事使我能够感到愉悦。所以每次他都只说凌召的事情,其它的事情包括他自己的事情他都是只字不提。

人生总是会出现很多无法预料的事情,上次因为打架而跟李文龙一起退学的程三石和他又在一中碰到了,他们又打了起来。这次打架后,李文龙就一直没有再到一中来。

这样我再无法知道凌召的消息,就算是守株待兔吧,我还是想像上次那样能够在那书店偶遇凌召。这次我要主动问他的近况,我暗暗的下着决心。

我和他还是有缘分的吧,一次我在书店里面挑书,跟我一起来的小学时就跟我要好的姚婷好像在书店门口和什么人说着话。我走出书店,发现是凌召,他还是跟上次一样,一见到我就低着头,姚婷说凌召比以前帅了,但我觉得他一直都很帅啊。

姚婷后来说凌召要给老同学们写贺卡,想着十中这最后一届足球联赛没有了李文龙,夺冠可能无法实现了,我也没法知道凌召心里那个她是不是我,想着每次碰见凌召那害羞的画面,我越发想确认了。于是我给凌召回卡里表达希望他能够夺冠的心情,我想如果凌召心中的那个她是我的话,他一定会全力以赴去夺冠的吧。我想当他获得冠军那天,我会鼓起勇气向他表白,就算没有夺冠,我也会,我不想错过我最喜欢的人。

接着的事情远比想象的好,从十中战胜李文龙带领的四十七中开始,校刊里不断出现凌召的身影,富家子弟王亦的加入让十中如虎添翼,战无不胜,一直冲到决赛和我们一中开始了最后的角逐。

决赛那天,空中飘满了气球彩条,赛前十中的王亦请来他们公司的当红明星过来表演助阵,从演出名单我能看到那位给凌召写情书的于佳的名字,现场我能看到于佳一边唱着歌跳舞,一边看着场边正在做准备运动的凌召,那种不一样的眼神,想想自己从小就很喜欢跳舞,也希望自己能够像于佳那样在观众面前表演展现自己。

比赛开始后,十中打得很不错,虽然我不懂足球,但从射门次数控球时间看来,明显能够感觉十中占据了优势,果不其然在中场结束前凌召一脚凌空射门将球打入。看着凌召兴奋的在场上奔跑着,我也忍不住欢呼起来。当然我能够感觉到边上同学看着我的异样眼神。我兴奋的拿着早已准备好的毛巾和水朝十中场地那边走去。

当我接近时,凌召正开心的带着一副帅气自信的笑容朝场边一位看起来秀美很有气质的女孩走去,那女孩微笑着用手中的毛巾擦着凌召额头的汗水,凌召的表情看起来幸福极了,他笑着从那女孩手中接过水,这时,我已感到脚有些发软,我急忙转过身朝人群中走去。此时,我觉得自己好傻,我这么一个平凡的女孩还天真的以为凌召会喜欢自己,想着他一直都在不断的努力着,琴弹的那么好,能够让和他一样优秀的于佳对他恋恋不忘,还通过自己的努力把自己不擅长的足球都踢得这么好,能够交上这么一个气质与美丽兼备的女朋友。

觉得天天想着的凌召离自己越来越远,有种以后就再也无法见到凌召的感觉,我坐在观众席上,用捧着的头发将头埋在里面不停的流着眼泪,比赛的结果对我来说已不重要。

那以后,我再也没有见过凌召,但对他的这段思念去一直住在我心里。”

看完这篇文章,凌召已按耐不住了,他已管不了那么多了,他一定要去见丁晓炎,不管她现在如何,也不管她是否还和以前一样喜欢自己。

通过出版社,凌召找到了丁晓炎的家。

打开门的是一个十来岁的男孩,凌召突然觉得自己是不是有些冒失。这么多年了,自己虽然没有结婚,但同龄人大多都该有这么大的孩子了。

“你是凌召叔叔吧。”那小孩问道。

凌召从发呆中回过神来。用惊讶的眼神看着那小孩。那男孩没等凌召回答继续说道:“来找我妈妈丁晓炎吧,她已经去世了,就在不久前。”

男孩看着凌召的眼睛,已经红了一片。

“我是丁晓炎的养子,我翻她的日记本知道了你。”男孩说完牵着凌召来到丁晓炎的房间,房间里书柜上堆满了书,书桌上还留着她未完成的作品草稿,相比结局丁晓炎一定会写得很圆满吧。凌召这么想着,眼前浮现出丁晓炎坐在书桌前写着小说的身影。他伸出手,那身影化成粉末飘散开去,在阳光的照耀下散发着亮光。

男孩拿出一个日记本递给凌召,刚翻开,他已控制不住满脸泪水如泉水不住从下颚流下来。那日记本里贴满了丁晓炎从校刊里剪下的凌召的照片,这么多年她一直精心的保存着。

[小说]十中 第四话

足球毕竟是团体运动,这次联赛也是凌召初中生活最后一次了,十中没有李文龙进入淘汰赛都非常困难,可凌召也顾不了这么多了,他现在只有全力提高自己的体力和球技,他把训练时间延得更长了,休息时就看意甲,研究战术和队友们的话题也是十句九句不离足球。

到了赛季,十中开局虽然胜了两局,但是都非常的吃力。第三场面对的对手是上届第四名的四十七中,因为接受了被十中开除的天才足球少年李文龙,这次他们的目标是冠军。

比赛前,十中更衣室,凌召将大家聚到一起说:“大家心里肯定都明白,这场比赛我们想赢几乎不可能,但我这几天仔细的看了他们的球员资料和比赛录像,具体情况我先不说,大家只要按我的计划来,还是有机会能够胜的。”

队友们都用好奇而怀疑的目光看着凌召,只有教练点了点头说:“凌召,这次我是真没招了,如果你有那么一丁点把握就去试试,我支持你。”

“那好,这次按541进行防守,上半场我不上场,只守不攻。下半场采用防守反击,我会全力将比分扳回来。”

队员们和教练都惊诧的看着凌召,多么冒险的一招棋啊。但凌召却表现得异常冷静而自信。

“好,大家就按凌召的办法来,加油,十中必胜!”教练大声给队员们鼓气。

比赛一开始,四十七中的攻击就在李文龙的带领下如狂风暴雨般倾盆而下,虽说是全场防守,但在这样有组织又激烈的撞击下也没能守得住。上半场以0比7大比分落后,这样的比分,无论是观众还是在十中队员甚至是对凌召有信心的教练看来都是没有什么扳回的机会了。韩霍气冲冲来到凌召面前大声吼道:“看你干的好事,十中的脸都让你丢尽了。”

哪知凌召却轻松的回答道:“丢脸的是你吧,我又没在场上。”

韩霍咬着牙,眼睛直瞪着凌召说:“好小子,有你的,乘机报复我是吧,等会下半场看你怎么收拾这局面。”说完转身做了个操的手势。

“喂,韩霍,有本事跟我比比吗?”凌召说。

“比什么?”

“比下半场是你丢球少还是我进球多,怎么样。”凌召笑着说。

“比就比,输了,就等着被我揍吧。”韩霍用手指着凌召说。

“好,我输了,随你怎么打,我绝不还手。”

下半场,四十七中为了保存实力,换下了两名主力,李文龙继续在场上。开球时,凌召望着李文龙。

“终于等到这一刻了,看来你是宝都压到下半场了,让我们好好比比吧。”李文龙笑着对凌召说。

“恩,可不要放水啊,不然我们就不是好兄弟了。”凌召说。

“还当然。”

哨声响起,凌召犀利的带着球一连突破中场来到后场,后场队员一脚铲了过来,凌召将球挑起,跳过对手,一脚站地,另一脚凌空一个快速的大弯弧线球冲向四十七中大门左侧,球擦着球门侧栏应声入网。这一球一气呵成漂亮极了。李文龙也惊住了,这不是他最擅长的那招么,竟被凌召运用的这样娴熟。

接下来,李文龙进攻的机会越来越少,凌召控球时长越来越长,满场的跑,李文龙上半场踢得太疯,体力没法跟上凌召了。一旦李文龙接住球,凌召还会过来协助围堵,断下球就回传队友,自个拼命往前跑,接到长传就疯狂的攻击。在这样疯狂的战术下,居然扳回了比分,打成了8比8平,进入加时。

加时赛时,四十七中已没有了换人名额,而十中将体力充沛的三名队员换上场,这时四十七中被一口气追上这么多比分心理上的压力是数倍于十中的。原来这一切也都在凌召的预料之中。早在比赛前,凌召就仔细研究过四十七中,发现他们今年厉害的后卫都退役了,新生的没有补上,联赛以来一直以攻代守,所以他才想到不在上半场和他们硬拼,将赌注都压在了下半场。看来这战略是没错了,在加时赛时凌召依旧保持了下半场那股冲劲将四十七中打回了老家。

比赛结束后,李文龙走了过来,伸出手,凌召抓住他的手,李文龙红着双眼说:“你赢了,我不如你。”

凌召用力一拽将李文龙抱住,凌召对李文龙的感觉真是酸甜苦辣咸五味俱全。这一时竟无话可以说出来。对于李文龙与无巨细的教足球他感激不尽,对于丁晓炎的事情他醋意满满,对于退学的事情他追悔莫及。

这场与李文龙的对战立刻传遍各个中学,校刊上到处都是凌召球场上的照片和采访的照片。赛中凌召战术的安排,下半场精妙绝伦进攻表现让人印象深刻。

训练时,教练领着几位新同学来到大家中间,对大家说:“同学们,这三位今天要加入我们十中的校队,他们都是非常优秀的球员,这次我们有希望能够那个冠军回来了。”

其中一位长发飘飘走到凌召跟前说:“凌召,上场比赛够精彩的,多么又想象力的比赛啊!其他两位都是跟着我来的,都是经验丰富的好手。对了,我叫王亦,待会我就办入学手续,到你班上,以后多多指教,让我来帮你圆个冠军梦吧。”

王亦是个爱热闹的人,他组织班上同学到他家里开派对。他家在江边有座独楼。这次派对王亦发现凌召总是一副闷闷不乐的表情,在房顶烧烤时,王亦发现凌召已经回去了。他向身边的秦珊打听原因。

“你刚来不知道,凌召以前跟于佳好过一阵,现在于佳跟凌召死对头韩霍在一起,你说你把他们邀到一块,凌召不尴尬才怪。”秦珊说。

“喔,喔,这样,我算明白了,这好办,我再办个派对。”王亦笑着说。

他果然说到做到,打听到跟凌召关系好的同学后。没几天他又办了个,这次,他只请了一些跟凌召玩的好的到江滩边烧烤。他特意请了于佳而没请韩霍。一箱烧烤吃的差不多时,王亦给大伙使了个眼色,说:“走,走,大家帮我再搬下吃的来。”凌召和于佳准备起身时,王亦对他说:“你们就在这里等好了,让我们去搬就好了。”

一转眼,江滩就只剩凌召和于佳了。与刚才的喧嚣相比,此刻的安静有点让人窒息的感觉。远处江面传来一阵船鸣声,于佳站了起来。望着坐在地上一脸无所适从的凌召说道:“王亦是故意的,找这个机会让我单独和你在一起。”

“为什么这么说?”凌召抬头望着双手叉在背后一只脚抬起做出不稳姿态的于佳说。

“他找过我,跟我说,要我不要跟韩霍在一起,让我和你好。”

“什么?他怎么…”凌召惊慌的站起来。

“他一定是错以为你喜欢我,所以想帮你,但其实是你不要我。”于佳转过身望着远方那支鸣着笛缓缓开过来的船。凌召又低下头,于佳转头看着凌召,接着说:“我现在还喜欢你,但你不要担心,我只要把你放在心里就好。”于佳将右手放到胸口,眼眶开始湿润起来。

凌召望着于佳欲言又止。

“王亦说如果我跟你好的话,可以捧红我。”于佳说。

“王亦?他有这本事。”凌召奇怪的问。

“你不知道吧,他父亲是王朝集团董事长,王朝娱乐就是他们旗下的,那个SGirls组合就是王亦班上的,他给一手捧红的。”

“难怪他家房子这么大呢,但是我…”凌召为难的说不下去了。

“没事,你不用愧疚,我已经告诉王亦我们的事情了,他说只要以后不跟韩霍在一起就行,免得让你看着心里难受。我答应了,反正我跟韩霍一起也是因为你,一点不可惜,我会好好把握这次机会...”于佳一副强作开心的笑着说。还有一句她没有说出口:“等我成为万人迷时,我想那时你可能会喜欢我的。”

“我是真心祝你能够成功的,你的愿望马上就要实现了。”凌召从地上捡起一听可乐,哧的一声打开,举杯说道。

“可惜我的愿望不是这个啊。”于佳眼睛直直的看着凌召,好像有种支撑不住想要倒在他怀里的感觉。凌召是知道于佳想法的,双眼无法承受这种过浓的情意,有种无法呼吸的感觉。

凌召一口气将手中可乐喝完。将易拉罐捏扁用力抛向江面。呼出一口气,接着对于佳说:“我最近写了一个新曲子,要不要听听?”

于佳点了点头,凌召从书包中掏出一个口风琴吹了起来。

于佳坐在地上,头侧贴着交叉置于双膝的双手上,目不转睛的望着吹着口风琴的凌召,细细的欣赏他的曲子。

吹完曲子,凌召自信的笑着说:“怎么样,等你成为明星后,让我做你的御用作曲人没问题吧。”

于佳没有回答他,从他手中拿过口风琴,没有擦,直接放到嘴上吹了起来。吹的曲子就是许愿那次他们一起弹的那首。每次想凌召时于佳就会弹这首曲子,于佳娴熟的吹着这首曲子,因为她早已弹过了无数遍。双手握着凌召的口风琴,贴着琴口,仿佛感觉自己已抱着凌召,吻着他的唇。她知道这只是幻觉,泪水已忍不住流过面颊滴在了口风琴上。

王亦继承了他父亲那种聪明和气质,不光成绩名列年纪第一,对待同学也十分平易近人,一点架子都没有。对于凌召来说,在接下来比赛中,王亦无疑起到了巨大的作用,使得十中能够顺利进入到淘汰赛。

随着联赛到了淘汰阶段,凌召他们年纪也开始面临初三的毕业。学校为了保证升学率,专门开设了晚间提高班,将那些各个班级成绩一般但有希望能够进一步提高的同学集中到一个班上学习。凌召成绩一般所以也在这群人中,这样他就还需要多花些时间在这个提高班上。

放学后,凌召跟王亦分组进行了一场训练赛,吸引力很多的同学围观。很多非球迷都是因为想看王朝董事公子王亦而慕名而来的。王亦球场上一头长发飘飘,非常帅气,球技也不亚于李文龙,和他一块来的两名同学也是他精挑细选的,所以这次十中能够进入淘汰赛,王亦亦是功不可没。打完训练赛,凌召已是大汗淋漓,接着他还要赶着去参加提高补习。

凌召来到提高补习教室,坐了下来,身上的热气还没有散,他从书包里拿出本子不住的扇着。

“跑着来的吧。”凌召旁边一位女孩子问道。

“刚才踢球了,好热!”凌召一边扇着,一边转过头看那女孩。那女孩白白净净的,五官清秀端正,大大的眼睛正有神的瞧着额头发稍汗湿的凌召。

“我叫田晓宁,是你提高班的同桌。”田晓宁说。

“我叫凌召,看我这身汗,我先去冲下。”凌召用手提了提衣领口。

冲完,凌召感觉舒畅极了。课上,田晓宁问凌召:“你在班上排名第几?”

“三十多吧。”

“我也是,那你打算考哪个高中?”

“还是十中吧。”

“我打算上一中,不过可能考不上。”田晓宁看起来也没有怎么担心的样子说。

凌召听到一中就想起了丁晓炎来,想着她是不是也能考上一中高中呢,转而一想是不是自己也应该好好学习了,也争取考上一中高中呢,这样就能够常常见到她了。

“我也想考一中。”凌召说:“但是现在水平估计难,离中考也没有多长时间了,不知道还来不来得及。”

“所以才让我们来提高班嘛,努力努力还是有希望的。”田晓宁蛮自信的说着。

在课上,田晓宁埋着头在本子上涂着画,凌召觉得很诧异,刚不是说要上一中么,上课还这么不认真。

“田晓宁,不是想考一中吗,怎么不好好听课,在画什么呢?”凌召问田晓宁,凑过去看她在画什么。

田晓宁急忙趴在本子上,有些不好意思地说:“没画什么,我是要上一中,考不上也能上的。”

“是么,你家有关系么。”

“恩,我爸有办法。凌召,你高中毕业后有打算考哪个大学吗?”

“这个,还从没想过呢,先把中考搞定再说吧。你有打算考哪个大学吗?”

这时老师发现他们俩一直在讲话,就点田晓宁站起来回答问题,田晓宁站起来时一着急把那个本子弄到地上,凌召帮着将那本子捡起,已经站着的田晓宁焦急而尴尬的看着凌召捡起本子后惊讶的看着本子的表情。

田晓宁回答完问题,满脸通红的从正在仔细欣赏本子上画的凌召手中将本子拿了回来。

“真像,你很早就知道我了呢,前面都是我踢足球玩乐器的画,最后一张肖像画是刚才画的吧,跟照片一样样的,好厉害好专业。”凌召兴奋的说。

田晓宁合上本子低着头半天都没有啃声。

快下课时,田晓宁对凌召说:“下次提高课你带几张你的照片送给我好吗,我现在还画的不好,有照片毕业后还能够有个纪念。”

“好啊,没问题。”凌召站起来收拾书包打算走。

“还有,你问我大学想去哪,我是打算直接去美国读,我有亲戚在那。”田晓宁说。

“美国,这么好,我就没有办法了,我没有一个亲戚在国外。”凌召羡慕极了。

“我去了后就可以给你担保啊,这样你也能够过来了啊。”田晓宁一副感觉一切都是轻而易举似的表情说。

凌召看着田晓宁期待的眼神看着自己,他知道这只是随口说出的一句话,但心里却是十分开心着呢。

回家路上,他一路哼着小曲。

随着淘汰赛的进行,一切都看起来很顺利。摆在十中面前的最后一堵墙是连续获得数届冠军的一中。

广播体操结束后,凌召和王亦边走边聊着应对一中的战术,在上楼梯时,一个女孩大叫了一声凌召的名字,凌召和王亦朝上看去,原来是田晓宁,凌召也回了句:“田晓宁。”挥挥手跟她打了个招呼。

王亦凑到凌召耳边说:“怎么认识这么漂亮的女孩,回头介绍给我。”

凌召看了看王亦色迷迷的眼神,忽地想起叶正找他递给于佳情书的事情,结果是两边不讨好,叶正这个朋友也没得做了。于是凌召对王亦说:“我也不认识啊,就是一粉丝,想泡自己追去。”说完就快速朝前走去。

王亦赶紧追了去,拉下凌召的衣袖说:“喂!别那么小气,不像介绍就算了,也用不着这样嘛,名字都记住了还说不认识,不用担心,兄弟我不跟你抢,漂亮妹子多的是,有你这么好的哥们可不容易咯。”

凌召笑着用力朝王亦胸口推了一把,假装生气的说:“去,谁担心了,不要太自信了,好好准备下场比赛,我想赢,我最在乎的人也希望我能赢,现在只剩最后这一场了。”

王亦看着凌召一脸认真的表情,哈哈大笑说:“最在乎的人,哈哈,是刚才那个漂亮女孩吗?”接着假装一本正经拍了拍凌召的肩膀说:“这不,here I am,我来十中就是来助你一臂之力的,我来这就是因为你,你不知道吗,你不知道你那场和李文龙的比赛又多精彩,彻底的吸引了我。”

“少胡扯,谁不知道是你老爸在这边有个项目才把你带过来的,这些甜言蜜语的话跟姑娘说去。我看你最近练球越来越不刻苦了,一点都不像李文龙。”凌召非常认真的表情说道。

“像李文龙那样干嘛,还不是被你击败了。”王亦一脸不服的说。

“他只是在足球上,准确来说是那一场比赛输给了我,其它地方,我比不过。算了,总之一句,已经到了这一步,绝对不能输,ok?”

看着凌召真的认真起来,王亦在一旁不停地点着头。