前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP设计模式——模板方法

PHP设计模式——模板方法

作者头像
Lemon黄
发布2019-11-11 18:39:30
2.1K0
发布2019-11-11 18:39:30
举报
文章被收录于专栏:Lemon黄

在方法中定义算法的框架,将某些步骤推迟到子类。模板方法(Template Method)可让子类在不更改算法结构的情况下重新定义算法的某些步骤。

管理公司员工的日常行程可能是一项耗时的工作。如果可以使用程序将日常任务编程为自动发生,那将容易得多。Mark在Yahaa Inc工作了四年, 他是一名程序员,他的日常工作主要的是从事与编程有关的任务。Elisa是同一家公司的营销经理;像Mark一样,她有自己的日常活动,而她则主要从事营销工作。

作为程序员,Mark在公司的日常工作如下:

代码语言:javascript
复制
class Programmer
{
 
    public function workRoutine()
    {
        $this->markAttendance();
        $this->doProgrammingTask();
        $this->reportDailyCompletion();
    }
 
    public function markAttendance()
    {
        echo '我正在打卡';
    }
 
    public function doProgrammingTask()
    {
        echo '正在做编程的任务';
    }
 
    public function reportDailyCompletion()
    {
        echo '我正在报告我的每日完成进度';
    }
}
  • Mark每天到公司时,他要做的第一件事就是在出勤跟踪系统中打卡。这样可以确保他当天的工资(markAttendance())。
  • 此后,他就会投入到自己的本职工作中(doingProgrammingTask()
  • 最后,他会写一份详细的每天报告,报告他当天完成的工作(reportDailyCompletion()

现在,营销经理Elisa的行事方式与Mark几乎相同,除了第二步。作为营销人员,日常工作的第二部分是执行与营销相关的任务。

我们可以轻松地在上面的两个类中发现代码重复。程序员和营销人员都共享一些通用程序。

我们如何来重构代码呢?

如果可以在超类中定义一些通用的方法,但仍然给子类提供灵活地可以定义子类自身的功能,那么显然可以做得更好。而这就需要应用到模板方法(Template Method)模式了。

现在我们用一些预定义的函数定义一个抽象的超类:

代码语言:javascript
复制
class Employee
{
    public function workRoutine()
    {
        $this->markAttendance();
        $this->doWork();
        $this->reportDailyCompletion();
    }
 
    public function markAttendance()
    {
        echo 'I am marking my attendance';
    }
 
    public function reportDailyCompletion()
    {
        echo 'I am reporting my daily completion';
    }
 
    abstract public function doWork();
}

该类看起来与之前的Programmer类非常相似,不同之处在于,我们删除了两个类之间不同的函数,并用抽象类doWork()代替了它。

现在,让我们重构Programmer和并且可以很方便的创建针对营销人员Marketer类:

代码语言:javascript
复制
class Programmer extends Employee
{
    public function doWork()
    {
        $this->doProgrammingTask();
    }
 
    public function doProgrammingTask()
    {
        echo 'doing programming task';
    }
}
 
class Marketer extends Employee
{
    public function doWork()
    {
        $this->doMarketingTask();
    }
 
    public function doMarketingTask()
    {
        echo 'doing marketing task';
    }
}

如我们所见,ProgrammerMarketer类都变得更加整洁,不再有任何代码重复。

在我们的示例中,我们在方法(Employee类中的workRoutine()方法)中定义算法的框架,将某些步骤(doWork())推迟到子类(ProgrammerMarketer类)中。模板方法(Employee类中的doWork()方法)使子类(ProgramerMarketer类)重新定义算法的某些步骤(doWork()),而无需更改算法的结构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lemon黄 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档