若转载教程,请注明出自SW-X框架官方文档1

    1. <?php
    2. /**
    3. * 设计模式之模板模式
    4. * 优势在 将不变的方法和多变的方法分离。
    5. * 小黄牛
    6. */
    7. header("Content-type: text/html; charset=utf-8");
    8. /**
    9. * 抽象模板类
    10. * 调用模板方法,进行流程处理
    11. * 派生出数个多变的方法,内置一个不变的方法
    12. * 场景:可以假设这个类是一个手机制造厂家 - 他需要知道找他制造手机的品牌名 - 然后品牌商按照厂家制定的步骤,各自制造出不同的零件 - 最后统一回到总部组装
    13. */
    14. abstract class MakePhone {
    15. public $name; // 品牌名
    16. # 找我们做手机之前先报上自家名号
    17. public function __construct($name){
    18. $this->name = $name;
    19. }
    20. # 组装方法 ,都是不变的组装流程
    21. public function MakeFlow(){
    22. $this->MakeBattery();
    23. $this->MakeCamera();
    24. $this->MakeScreen();
    25. echo $this->name.': 手机生产完毕!<br/>';
    26. }
    27. # 派生出三个零件制作流程,交由品牌商自己制作
    28. public abstract function MakeScreen(); // 屏幕
    29. public abstract function MakeBattery(); // 电池
    30. public abstract function MakeCamera(); // 摄像头
    31. }
    32. /**
    33. * 我是 - 小米品牌商
    34. */
    35. class XiaoMi extends MakePhone{
    36. # 按照厂家给的流程,制作手机零件
    37. public function MakeScreen(){echo $this->name.'屏幕生产完成!<br/>'; } // 屏幕
    38. public function MakeBattery(){echo $this->name.'电池生产完成!<br/>'; } // 电池
    39. public function MakeCamera(){echo $this->name.'摄像头生产完成!<br/>'; } // 摄像头
    40. }
    41. /**
    42. * 我是 - 魅族品牌商
    43. */
    44. class MeiZu extends MakePhone{
    45. # 按照厂家给的流程,制作手机零件
    46. public function MakeScreen(){echo $this->name.'屏幕生产完成!<br/>'; } // 屏幕
    47. public function MakeBattery(){echo $this->name.'电池生产完成!<br/>'; } // 电池
    48. public function MakeCamera(){echo $this->name.'摄像头生产完成!<br/>'; } // 摄像头
    49. }
    50. # 实例Demo
    51. $xiaomi = new XiaoMi('红米3');
    52. $meizu = new MeiZu('魅蓝Note2');
    53. $xiaomi->MakeFlow(); // 生产一部小米手机
    54. $meizu ->MakeFlow(); // 生产一部魅族手机

    浏览器输出

    1. 红米3电池生产完成!
    2. 红米3摄像头生产完成!
    3. 红米3屏幕生产完成!
    4. 红米3: 手机生产完毕!
    5. 魅蓝Note2电池生产完成!
    6. 魅蓝Note2摄像头生产完成!
    7. 魅蓝Note2屏幕生产完成!
    8. 魅蓝Note2: 手机生产完毕!

    模板模式

    1. 抽象模板角色(MakePhone):抽象模板类,定义了一个具体的算法流程和一些留给子类必须实现的抽象方法。
    2. 具体子类角色(XiaoMi):实现MakePhone中的抽象方法,子类可以有自己独特的实现形式,但是执行流程受MakePhone控制。

    适用场景及优势

    1. 1、假设我们编写某项功能的过程中,会在某一细节层出现统一的步骤,但这个步骤有可能实现的是不同的逻辑处理。我们通常考虑用模板模式来处理。
    2. 2、模板模式可以把不变、多变和重复使用的方法从程序中分离,,我们通过模板模式把这些行为搬移到单一的地方,这样就帮助子类摆脱代码冗余的纠缠,也方便后期维护。
    3. 3、模板模式的优势在于 行为分离和代码复用性上。