C++浅谈设计模式9——模板模式


昨天那种朝三残四底秉性又来了。看了一点全勤钱会C++的靶子生灭,踌躇半上,码了贴近1000来字,最后要毅然删掉。毕竟下定狠心不要开虎头蛇尾的事情,况且现在元气确实少,如果少只同块写,表面上得以于及彼此加的打算,但是最后必将是分娩,两样都开不好。所以,最终或放弃了新开始一个C++版块的打算。
仲起值得一说之事体是,厕所不仅会缓解内急,而且为是灵感爆发的场地。这个地处十年前初中的自不怕已发现,不过到底自己是只干活虎头蛇尾的人口,所以好习惯确实也没有坚持下。也难怪考研班的政老师每天晚上一边上厕所一边发微博。
(感觉我此人口不但向三残四,而且忘性极大,刚才计划说之某些项事,好像跟冲厕所一样,瞬间尽管从未了)那再说说降噪耳机的行吧。虽然多丁还喜爱热闹,但自怀念还是生部分人数欢喜安静的——尤其是冷静详和的夜。看到同一篇文章就是说,程序员不要总将钱消费在吃上,要多关系点别的从。可能这种状况便是本着自己的话的。直接切入主题。不明白大家产生没发生受身边那群或者真情喷张,或者喋喋不休的人数打扰,如果是这样的话,我道大家不妨看下“主动降噪耳机”。不过就算是极致昂贵了,拿在微薄补贴的本身真的对望2000底事物有点怕。好吧。先到之,说基本上矣就算是话唠,总的即要是高效写了马上篇。

模板模式本身并无碍事,但是,其同政策模式、工厂模式还要闹相似点。所以可能会见来乱,但是一旦牢牢把住核心,我思三只模式还是好好界别。由于政策模式位置于靠前,因此,本篇将重点于策略模式及模板模式简单栽模式之异议。顺便为终于一种复习。

1、背景
模(mu)板模(mo)式其实说起来颇粗略——这些模式我怀念应该还是源于生活之,活生生的实例。书及之事例还是蛮对,所以就是借出书及之事例好了。
茶和咖啡我思大家都喝了。冲咖啡的主导步骤:煮开水、冲咖啡、倒杯子里、加奶和糖。冲茶的中坚步骤:煮开水、冲茶、倒杯子里、加柠檬(老外的喝法,真想不通加柠檬有吗好喝的,红茶加蜂蜜倒还不错)。从地方冲泡茶和冲泡咖啡的步子来说,有广大相似点,而且步骤上且非常近似:
1)煮开水
2)冲饮品
3)倒杯子里
4)加佐料
然,就规范了同一效工作流程——框架。利用是框架,基本的步子不更换——骨架不变换,而具体的步骤可以来转移——填充物根据不同子类各具特色。这样咱们虽清楚的看了模版模式之端倪(突然想起昨天关押朋友围出现“涅槃”这个词——凤凰的弱而象征该重生。也就是同一个私的生死轮回)。好了,废话不多说,还是高达代码。

2、模板模式

abstract class Drink
{
    final public void prepare(String order)
    {
        boil();
        steep();
        pour();
        if(askConsumer(order))
            addAccessory();
    }

    final public void boil(){}
    final public void pour(){}

    abstract public void steep();//冲泡
    abstract public void addAccessory();//加佐料

    public boolean askConsumer(String order)//是否加佐料,默认加
    {
        return true;
    }
}

class Coffee extends Drink
{

    @Override
    public void steep() {
        System.out.println("coffee");
    }

    @Override
    public void addAccessory() {
        System.out.println("add milk and sugar");
    }

    public boolean askConsumer(String order)//重写方法
    {
        if(order.startsWith("n"))//不加糖和牛奶
            return false;
        return true;
    }
}

class Tea extends Drink
{
    @Override
    public void steep() {
        System.out.println("tea");
    }

    @Override
    public void addAccessory() {
        System.out.println("add honey");
    }

    public boolean askConsumer(String age)
    {
        if(age.startsWith("elder"))//老年人喝多了蜂蜜容易得糖尿病
            return false;
        return true;
    }
}

如若齐先后,共创建了三单类似。
1)其中抽象类Drink中的prepare()方法记为模板。其规定了百分之百泡茶/冲咖啡的逐一。因此,该办法定义也final,从而确保当子类继承的时段,不会见挂是方法。

2)而对于boil()和pour()方法,也是这么一个道理。因为操作对象与操作方法均曾规定下来(煮水C++:操作对象啊和,操作方法为熬)(倒饮料:操作对象也冲调好之饮料,操作方法为:倒),因此,也吃声称也final方法。

3)注意到片独abstract方法,这点儿个方法就是为使依据那现实地,需要子类自身实现的法。而基类(抽象类)只是调用这点儿单主意,但不兑现就片独道。即将方法的落实延迟的子类中,保证了落实与接口的解耦。

4)最后一个askConsumer()写到此地肯定不是开玩笑的。这个办法叫做“钩子(hook)”方法。不过自己想,是匪是吧可让“槽(slot)”方法。这个艺术而比上面的有数只抽象方法而又进一步。基类提供了一个落实方式,但是子类可以根据实际情形,对拖欠方式进行覆盖。确实还是于像之,像钩子一样。有钩,当得挂香肠(覆盖实现)的当儿,可以挂及上面去,如果无钩子,怎么呢无能为力挂香肠了。

以此钩子方法以Java中还是较普遍。很多地方都是,基类中提供一个默认实现之接口,如果子类有破例需要之情况下,可以再次定义是接口。比如JFrame中之paint方法。以及Applet中的Init()方法齐。都是部分钩子方法。

3、策略模式及模板模式的比
交就,我思大家应该对策略模式都淡忘得几近了。反正自己曾经记不住多少了,不过幸而有实例程序,这个是无比好的。

interface FlyBehave
{
      public void fly();
}
class ReallyFly implements  FlyBehave
{
      public void fly(){  println("I can fly");}
}
class CantFly implements FlyBehave
{
      public void fly(){   println("i cant fly") ;}
}

class Duck
{
      Color  color;
      FlyBehave flybehave;//注意此处,采用接口定义属性,为了实现多态

      public Duck(FlyBehave f){ flybehave = f;}
      public void fly() {  flybehave.fly();//多态调用  }
}

//测试一下
public class Test
{
      Duck  WildDuck=new Duck(new ReallyFly());
      WildDuck.fly();//打印显示:I can fly
}

于点的代码可以看来,策略模式应用组合的方式,将艺术封装到某某类吃,再以应用是法子的接近吃,声明其也性。这样经过性能来调用方法。

额,其实说心声,我无晓作者到底想别啥,看罢代码以后,我当策略模式与模板模式完全就是是两码事。

方针模式是眷恋让类的调用的点子还有弹性,也就是说,达到因地制宜的力量。而模板模式,是为规范一模拟框架,让抱有的子类遵循框架的要求,执行相应职责。所以,此处我眷恋要不要仔细比较了。相信聪明的您,很快便可知心领神会这半种植模式到底有啊异同点。