PHP开发PHP经验分享

编程中的设计模式之建造者模式

2020-07-19  本文已影响0人  phpworkerman
介绍

建造者模式(Builder Pattern)使用一个个简单的对象构建出复杂的对象,属于创建型模式。这类模式有两个工作核心,一个负责创建和提供类,另一个负责处理类之间的依赖关系。

处理文件实例

模拟一个需求:通过传入 php 文件和 sh 文件,采用不同的编辑器进行处理,php 使用 phpstorm,sh 使用 notepad ,并记录操作日志,php 使用 word 记录,sh 使用 excel 记录(纯粹学习用,真实业务不这么设计),这时候语言编辑器、日志编辑器、文件处理方式都是独立的产品部件,需要工厂生产出来,组装后才能提供给客户端。

<?php
//定义建造类接口,负责各个子类的建造
interface Builder
{
    public function file($file);
    public function editor();
    public function exec($file);
}
//定义抽象类实现建造类功能,是对具体的类(产品)概括
abstract class ExeFile implements Builder
{
    public function file($file)
    {
        return pathinfo($file, PATHINFO_EXTENSION);
    }

    public abstract function editor();
    public abstract function exec($file);
}
//具体文件类实现
class PhpFile extends ExeFile
{
    public function editor()
    {
        return new Phpstorm();
    }

    public function exec($file)
    {
        $editor = $this->editor();
        $ext = $this->file($file);
        return $editor->handle($ext);
    }
}
//具体文件类实现
class ShFile extends ExeFile
{
    public function editor()
    {
        return new Notepad();
    }

    public function exec($file)
    {
        $editor = $this->editor();
        $ext = $this->file($file);
        return $editor->handle($ext);
    }
}
//抽象日志编辑工具类
abstract class OfficeFile implements Builder
{
    public function file($file)
    {
        return pathinfo($file, PATHINFO_EXTENSION);
    }

    public abstract function editor();
    public abstract function exec($file);
}
//具体日志编辑工具类实现
class Word extends OfficeFile
{
    public function editor()
    {
        return new Msword();
    }

    public function exec($file)
    {
        $editor = $this->editor();

        $ext = $this->file($file);
        return $editor->handle($ext);
    }
}
//具体日志编辑工具类实现
class Excel extends OfficeFile
{
    public function editor()
    {
        return new Msexcel();
    }

    public function exec($file)
    {
        $editor = $this->editor();

        $ext = $this->file($file);
        return $editor->handle($ext);
    }
}
//定义文件编辑器类的接口
interface Editor
{
    public function handle($ext);
}
//具体编辑器类实现
class Phpstorm implements Editor
{
    public function handle($ext)
    {
        return '当前用Phpstorm操作的是 ' . $ext . ' 可执行文件';
    }
}
//具体编辑器类实现
class Notepad implements Editor
{
    public function handle($ext)
    {
        return '当前用Notepad操作的是 ' . $ext . ' 可执行文件';
    }
}
//具体编辑器类实现
class Msword implements Editor
{
    public function handle($ext)
    {
        return 'Msword 记录'. $ext .'文件执行过程,并生成LOG';
    }
}
//具体编辑器类实现
class Msexcel implements Editor
{
    public function handle($ext)
    {
        return 'Msword 记录'. $ext .'文件执行过程,并生成LOG';
    }
}
//导演类,负责组装建造者类生成的产品
class OperaFile
{
    public function handlePhpFile($file)
    {
        $phpFile    = new PhpFile();
        $editor     = $phpFile->editor();
        $editor_msg = $editor->handle($file);

        $word    = new Word();
        $log     = $word->editor();
        $log_msg = $log->handle($file);

        return $editor_msg . '<br>' . $log_msg;
    }

    public function handleShFile($file)
    {
        $shFile     = new ShFile();
        $editor     = $shFile->editor();
        $editor_msg = $editor->handle($file);

        $excel   = new Excel();
        $log     = $excel->editor();
        $log_msg = $log->handle($file);

        return $editor_msg . '<br>' . $log_msg;
    }
}

$_file      = new OperaFile();
$php_result = $_file->handlePhpFile('demo.php');
$sh_result  = $_file->handleShFile('run.sh');
总结

建造者模式通过创建类来完成产品的创建,并由导演类完成产品的组装,和工厂模式相比,建造者模式多了一个导演类,会对产品进行组装然后再提供给客户端。

上一篇 下一篇

猜你喜欢

热点阅读