[
  {
    "path": "AbstractFactory/Article.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * Article 产品接口\n *\n * Interface Article\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\ninterface Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactory/Factory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * 工厂接口\n *\n * Interface Factory\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\ninterface Factory\n{\n    /**\n     * 创建 User 产品\n     *\n     * @return mixed\n     */\n    public function createUser();\n\n    /**\n     * 创建 Article 产品\n     *\n     * @return mixed\n     */\n    public function createArticle();\n}"
  },
  {
    "path": "AbstractFactory/MySQLArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * 应用于 MySQL 的 Article\n *\n * Class MySQLArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass MySQLArticle implements Article\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactory/MySQLFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * MySQL 工厂\n *\n * Class MySQLFactory\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass MySQLFactory implements Factory\n{\n    /**\n     * 创建 MySQLUser 产品\n     *\n     * @return MySQLUser|mixed\n     */\n    public function createUser()\n    {\n        return new MySQLUser();\n    }\n\n    /**\n     * 创建 MySQLArticle 产品\n     *\n     * @return MySQLArticle|mixed\n     */\n    public function createArticle()\n    {\n        return new MySQLArticle();\n    }\n\n}"
  },
  {
    "path": "AbstractFactory/MySQLUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * 应用于 MySQL 的 User\n *\n * Class MySQLUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass MySQLUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactory/SQLiteArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * 适用于 SQLite 的 Article\n *\n * Class SQLiteArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass SQLiteArticle implements Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed|void\n     */\n    public function insert()\n    {\n        echo '向 SQLite 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     *\n     * @return mixed|void\n     */\n    public function select()\n    {\n        echo '从 SQLite 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactory/SQLiteFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * SQLite 工厂\n *\n * Class SQLiteFactory\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass SQLiteFactory implements Factory\n{\n    /**\n     * 创建 SQLiteUser 产品\n     *\n     * @return SQLiteUser|mixed\n     */\n    public function createUser()\n    {\n        return new SQLiteUser();\n    }\n\n    /**\n     * 创建 SQLiteArticle 产品\n     *\n     * @return SQLiteArticle|mixed\n     */\n    public function createArticle()\n    {\n        return new SQLiteArticle();\n    }\n}"
  },
  {
    "path": "AbstractFactory/SQLiteUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * 适用于 SQLite 的 User\n *\n * Class SQLiteUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass SQLiteUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向SQLite数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从SQLite数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactory/User.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\n/**\n * User 产品接口\n *\n * Interface User\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\ninterface User\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactory/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactory;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\AbstractFactory\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        // 使用 MySQL\n        $factory = new MySQLFactory();\n        // 创建 user\n        $user = $factory->createUser();\n        $user->insert();\n        echo '<br>';\n        $user->select();\n\n        echo '<hr>';\n\n        $factory = new MySQLFactory();\n        // 创建 article\n        $article = $factory->createArticle();\n        $article->insert();\n        echo '<br>';\n        $article->select();\n\n        echo '<br><br>';\n\n        // 使用 SQLite\n        $factory = new SQLiteFactory();\n        // 创建 user\n        $user = $factory->createUser();\n        $user->insert();\n        echo '<br>';\n        $user->select();\n\n        echo '<hr>';\n\n        $factory = new SQLiteFactory();\n        // 创建 article\n        $article = $factory->createArticle();\n        $article->insert();\n        echo '<br>';\n        $article->select();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "AbstractFactoryWithReflection/Article.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * Article 产品接口\n *\n * Interface Article\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\ninterface Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/Factory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\nuse ReflectionClass;\nuse ReflectionException;\n\nclass Factory\n{\n    /**\n     * 数据库\n     *\n     * @var string\n     */\n    public $db = 'MySQL';\n\n    /**\n     * 产品类的命名空间\n     *\n     * @var string\n     */\n    public $namespace = 'Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\\\\';\n\n    /**\n     * Factory constructor.\n     */\n    public function __construct()\n    {\n        /**\n         * 从配置项中获取 driver\n         */\n        $config = include 'config.php';\n        $this->db = $config['driver'];\n    }\n\n    /**\n     * 创建 User 产品\n     *\n     * @return MySQLUser|SQLiteUser\n     */\n    public function createUser()\n    {\n        $className = $this->namespace . $this->db . 'User';\n        try {\n            $class = new ReflectionClass($className);\n            $user = $class->newInstance();\n        } catch (ReflectionException $Exception) {\n            throw new \\InvalidArgumentException('暂不支持的数据库类型');\n        }\n        return $user;\n    }\n\n    /**\n     * 创建 Article 产品\n     *\n     * @return MySQLArticle|SQLiteArticle\n     */\n    public function createArticle()\n    {\n        $className = $this->namespace . $this->db . 'Article';\n        try {\n            $class = new ReflectionClass($className);\n            $article = $class->newInstance();\n        } catch (ReflectionException $Exception) {\n            throw new \\InvalidArgumentException('暂不支持的数据库类型');\n        }\n        return $article;\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/MySQLArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * 应用于 MySQL 的 Article\n *\n * Class MySQLArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\nclass MySQLArticle implements Article\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/MySQLUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * 应用于 MySQL 的 User\n *\n * Class MySQLUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\nclass MySQLUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/SQLiteArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * 适用于 SQLite 的 Article\n *\n * Class SQLiteArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\nclass SQLiteArticle implements Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed|void\n     */\n    public function insert()\n    {\n        echo '向 SQLite 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     *\n     * @return mixed|void\n     */\n    public function select()\n    {\n        echo '从 SQLite 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/SQLiteUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * 适用于 SQLite 的 User\n *\n * Class SQLiteUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\nclass SQLiteUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向SQLite数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从SQLite数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/User.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\n/**\n * User 产品接口\n *\n * Interface User\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\ninterface User\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactoryWithReflection/config.php",
    "content": "<?php\n\nreturn [\n    'driver' => 'SQLite'\n];"
  },
  {
    "path": "AbstractFactoryWithReflection/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithReflection\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $factory = new Factory();\n\n        // 创建 user\n        $user = $factory->createUser();\n        $user->insert();\n        echo '<br>';\n        $user->select();\n\n        echo '<hr>';\n\n        // 创建 article\n        $article = $factory->createArticle();\n        $article->insert();\n        echo '<br>';\n        $article->select();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/Article.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * Article 产品接口\n *\n * Interface Article\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\ninterface Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/Factory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\nclass Factory\n{\n    public $db = 'MySQL';\n\n    /**\n     * Factory constructor.\n     */\n    public function __construct()\n    {\n        /**\n         * 从配置项中获取 driver\n         */\n        $config = include 'config.php';\n        $this->db = $config['driver'];\n    }\n\n    /**\n     * 创建 User 产品\n     *\n     * @return MySQLUser|SQLiteUser\n     */\n    public function createUser()\n    {\n        switch ($this->db) {\n            case 'MySQL':\n                $user =  new MySQLUser();\n                break;\n            case 'SQLite':\n                $user =  new SQLiteUser();\n                break;\n            default:\n                throw new \\InvalidArgumentException('暂不支持的数据库类型');\n        }\n        return $user;\n    }\n\n    /**\n     * 创建 Article 产品\n     *\n     * @return MySQLArticle|SQLiteArticle\n     */\n    public function createArticle()\n    {\n        switch ($this->db) {\n            case 'MySQL':\n                $article =  new MySQLArticle();\n                break;\n            case 'SQLite':\n                $article =  new SQLiteArticle();\n                break;\n            default:\n                throw new \\InvalidArgumentException('暂不支持的数据库类型');\n        }\n        return $article;\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/MySQLArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * 应用于 MySQL 的 Article\n *\n * Class MySQLArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\nclass MySQLArticle implements Article\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/MySQLUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * 应用于 MySQL 的 User\n *\n * Class MySQLUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\nclass MySQLUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向 MySQL 数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从 MySQL 数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/SQLiteArticle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * 适用于 SQLite 的 Article\n *\n * Class SQLiteArticle\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\nclass SQLiteArticle implements Article\n{\n    /**\n     * 新增\n     *\n     * @return mixed|void\n     */\n    public function insert()\n    {\n        echo '向 SQLite 数据库中插入 Article';\n    }\n\n    /**\n     * 查询\n     *\n     * @return mixed|void\n     */\n    public function select()\n    {\n        echo '从 SQLite 数据库中查询 Article';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/SQLiteUser.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * 适用于 SQLite 的 User\n *\n * Class SQLiteUser\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\nclass SQLiteUser implements User\n{\n    /**\n     * 新增\n     */\n    public function insert()\n    {\n        echo '向SQLite数据库中插入 User';\n    }\n\n    /**\n     * 查询\n     */\n    public function select()\n    {\n        echo '从SQLite数据库中查询 User';\n    }\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/User.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\n/**\n * User 产品接口\n *\n * Interface User\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\ninterface User\n{\n    /**\n     * 新增\n     *\n     * @return mixed\n     */\n    public function insert();\n\n    /**\n     * 查询\n     *\n     * @return mixed\n     */\n    public function select();\n}"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/config.php",
    "content": "<?php\n\nreturn [\n    'driver' => 'SQLite'\n];"
  },
  {
    "path": "AbstractFactoryWithSimpleFactory/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\AbstractFactoryWithSimpleFactory\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $factory = new Factory();\n\n        // 创建 user\n        $user = $factory->createUser();\n        $user->insert();\n        echo '<br>';\n        $user->select();\n\n        echo '<hr>';\n\n        // 创建 article\n        $article = $factory->createArticle();\n        $article->insert();\n        echo '<br>';\n        $article->select();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Bridge/Circle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 圆形\n *\n * Class Circle\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Circle extends Graph\n{\n    /**\n     * @return mixed|void\n     */\n    public function draw()\n    {\n        echo \"画一个 {$this->color->run()} 的圆形\";\n    }\n}"
  },
  {
    "path": "Bridge/Color.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 颜色抽象类\n *\n * Class Color\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nabstract class Color\n{\n    /**\n     * @return mixed\n     */\n    abstract public function run();\n}"
  },
  {
    "path": "Bridge/Graph.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 形状抽象类\n *\n * Class Graph\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nabstract class Graph\n{\n    /**\n     * 颜色\n     *\n     * @var Color\n     */\n    protected $color;\n\n    /**\n     * Graph constructor.\n     * @param Color $color\n     */\n    public function __construct(Color $color)\n    {\n        $this->color = $color;\n    }\n\n    /**\n     * @return mixed\n     */\n    abstract public function draw();\n}"
  },
  {
    "path": "Bridge/Green.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 绿色\n *\n * Class Green\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Green extends Color\n{\n    /**\n     * @return mixed|string\n     */\n    public function run()\n    {\n        return '绿色';\n    }\n}"
  },
  {
    "path": "Bridge/Red.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 红色\n *\n * Class Red\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Red extends Color\n{\n    /**\n     * @return mixed|string\n     */\n    public function run()\n    {\n        return '红色';\n    }\n}"
  },
  {
    "path": "Bridge/Square.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 正方形\n *\n * Class Square\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Square extends Graph\n{\n    /**\n     * @return mixed|void\n     */\n    public function draw()\n    {\n        echo \"画一个 {$this->color->run()} 的正方形\";\n    }\n}"
  },
  {
    "path": "Bridge/Triangle.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 三角形\n *\n * Class Triangle\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Triangle extends Graph\n{\n    /**\n     * @return mixed|void\n     */\n    public function draw()\n    {\n        echo \"画一个 {$this->color->run()} 的三角形\";\n    }\n}"
  },
  {
    "path": "Bridge/Yellow.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\n/**\n * 黄色\n *\n * Class Yellow\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Yellow extends Color\n{\n    /**\n     * @return mixed|string\n     */\n    public function run()\n    {\n        return '黄色';\n    }\n}"
  },
  {
    "path": "Bridge/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Bridge;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Bridge\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $red = new Red();\n        $yellow = new Yellow();\n        $green = new Green();\n\n        // 红色的正方形\n        $redSquare = new Square($red);\n        $redSquare->draw();\n        echo '<hr>';\n\n        // 黄色的正方形\n        $yellowSquare = new Square($yellow);\n        $yellowSquare->draw();\n        echo '<hr>';\n\n        // 绿色的正方形\n        $greenSquare = new Square($green);\n        $greenSquare->draw();\n        echo '<hr>';\n\n\n        // 红色的三角形\n        $redTriangle = new Triangle($red);\n        $redTriangle->draw();\n        echo '<hr>';\n\n        // 黄色的三角形\n        $yellowTriangle = new Triangle($yellow);\n        $yellowTriangle->draw();\n        echo '<hr>';\n\n        // 绿色的三角形\n        $greenTriangle = new Triangle($green);\n        $greenTriangle->draw();\n        echo '<hr>';\n\n\n        // 红色的圆形\n        $redCircle = new Circle($red);\n        $redCircle->draw();\n        echo '<hr>';\n\n        // 黄色的圆形\n        $yellowCircle = new Circle($yellow);\n        $yellowCircle->draw();\n        echo '<hr>';\n\n        // 绿色的圆形\n        $greenCircle = new Circle($green);\n        $greenCircle->draw();\n        echo '<hr>';\n\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "ClassAdapter/Adaptee.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ClassAdapter;\n\n/**\n * 源类\n *\n * Class Target\n * @package Baijunyao\\DesignPatterns\\ClassAdapter\n */\nclass Adaptee\n{\n    /**\n     * 金额\n     *\n     * @var string\n     */\n    public $money = '￥34';\n\n    /**\n     * 支付\n     */\n    public function pay()\n    {\n        echo '支付' . $this->money;\n    }\n}"
  },
  {
    "path": "ClassAdapter/Adapter.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ClassAdapter;\n\n/**\n * 适配器\n *\n * Class Adapter\n * @package Baijunyao\\DesignPatterns\\ClassAdapter\n */\nclass Adapter extends Adaptee implements Target\n{\n    /**\n     * Adapter constructor.\n     */\n    public function __construct()\n    {\n        $this->money = '$5';\n    }\n\n    /**\n     * 通知\n     */\n    public function notify()\n    {\n        echo '通知';\n    }\n}"
  },
  {
    "path": "ClassAdapter/Target.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ClassAdapter;\n\n/**\n * 目标类接口\n *\n * Interface Target\n * @package Baijunyao\\DesignPatterns\\ClassAdapter\n */\ninterface Target\n{\n    /**\n     * 支付\n     *\n     * @return mixed\n     */\n    public function pay();\n\n    /**\n     * 通知\n     *\n     * @return mixed\n     */\n    public function notify();\n}\n"
  },
  {
    "path": "ClassAdapter/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ClassAdapter;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\ClassAdapter\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        // 原本的类的\n        $adaptee = new Adaptee();\n        $adaptee->pay();\n        echo '<br>';\n\n        // 适配器\n        $adapter = new Adapter();\n        $adapter->pay();\n        echo '<br>';\n\n        $adapter->notify();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Command/Command.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Command;\n\n/**\n * 具体命令类\n *\n * @package Baijunyao\\DesignPatterns\\Command\n */\nclass Command implements CommandInterface\n{\n    /**\n     * @var \\Baijunyao\\DesignPatterns\\Command\\Receiver\n     */\n    protected $receiver;\n\n    /**\n     * Command constructor.\n     *\n     * @param \\Baijunyao\\DesignPatterns\\Command\\Receiver $receiver\n     */\n    public function __construct(Receiver $receiver)\n    {\n        $this->receiver = $receiver;\n    }\n\n    /**\n     * @return mixed|void\n     */\n    public function execute()\n    {\n        $this->receiver->action();\n    }\n}"
  },
  {
    "path": "Command/CommandInterface.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Command;\n\n/**\n * 命令接口\n *\n * @package Baijunyao\\DesignPatterns\\Command\n */\ninterface CommandInterface\n{\n\n    /**\n     * @return mixed\n     */\n    public function execute();\n}"
  },
  {
    "path": "Command/Invoker.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Command;\n\n/**\n * 命令发送者\n *\n * @package Baijunyao\\DesignPatterns\\Command\n */\nclass Invoker\n{\n    /**\n     * @var\n     */\n    protected $command;\n\n    /**\n     * @param \\Baijunyao\\DesignPatterns\\Command\\Command $command\n     */\n    public function setCommand(Command $command)\n    {\n        $this->command = $command;\n    }\n\n    /**\n     * 执行\n     */\n    public function run()\n    {\n        $this->command->execute();\n    }\n}"
  },
  {
    "path": "Command/Receiver.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Command;\n\n/**\n * 命令接收者\n *\n * @package Baijunyao\\DesignPatterns\\Command\n */\nclass Receiver\n{\n    /**\n     * 执行操作\n     */\n    public function action()\n    {\n        echo '执行操作';\n    }\n}"
  },
  {
    "path": "Command/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Command;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Command\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        // 命令行类设定接受者\n        $receiver = new Receiver();\n        $command = new Command($receiver);\n\n        // 命令接受者调用命令\n        $invoker = new Invoker();\n        $invoker->setCommand($command);\n        $invoker->run();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Decorator/Decorator.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 装饰  配料\n *\n * Class Decorator\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nabstract class Decorator implements Food\n{\n    /**\n     * @var Food\n     */\n    protected $food;\n\n    /**\n     * Decorator constructor.\n     * @param Food $food\n     */\n    public function __construct(Food $food)\n    {\n        $this->food = $food;\n    }\n}"
  },
  {
    "path": "Decorator/Egg.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 蛋\n *\n * Class Egg\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Egg extends Decorator\n{\n    /**\n     * 名称\n     *\n     * @return mixed|string\n     */\n    public function name()\n    {\n        return $this->food->name() . '+蛋';\n    }\n\n    /**\n     * 价格\n     *\n     * @return int|mixed\n     */\n    public function price()\n    {\n        return $this->food->price() + 1;\n    }\n}"
  },
  {
    "path": "Decorator/Food.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 食物\n *\n * Interface Food\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\ninterface Food\n{\n    /**\n     * 名称\n     *\n     * @return mixed\n     */\n    public function name();\n\n    /**\n     * 价格\n     *\n     * @return mixed\n     */\n    public function price();\n}"
  },
  {
    "path": "Decorator/Kaolengmian.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 烤冷面\n *\n * Class Kaolengmian\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Kaolengmian implements Food\n{\n    /**\n     * 名称\n     *\n     * @return mixed|string\n     */\n    public function name()\n    {\n        return '烤冷面';\n    }\n\n    /**\n     * 价格\n     *\n     * @return int|mixed\n     */\n    public function price()\n    {\n        return 6;\n    }\n}"
  },
  {
    "path": "Decorator/Latiao.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 辣条\n *\n * Class Latiao\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Latiao extends Decorator\n{\n    /**\n     * 名称\n     *\n     * @return mixed|string\n     */\n    public function name()\n    {\n        return $this->food->name() . '+辣条';\n    }\n\n    /**\n     * 价格\n     *\n     * @return int|mixed\n     */\n    public function price()\n    {\n        return $this->food->price() + 3;\n    }\n}"
  },
  {
    "path": "Decorator/Sausage.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 肠\n *\n * Class Sausage\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Sausage extends Decorator\n{\n    /**\n     * 名称\n     *\n     * @return mixed|string\n     */\n    public function name()\n    {\n        return $this->food->name() . '+肠';\n    }\n\n    /**\n     * 价格\n     *\n     * @return int|mixed\n     */\n    public function price()\n    {\n        return $this->food->price() + 2;\n    }\n}"
  },
  {
    "path": "Decorator/Shouzhuabing.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\n/**\n * 手抓饼\n *\n * Class Shouzhuabing\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Shouzhuabing implements Food\n{\n    /**\n     * 名称\n     *\n     * @return mixed|string\n     */\n    public function name()\n    {\n        return '手抓饼';\n    }\n\n    /**\n     * 价格\n     *\n     * @return int|mixed\n     */\n    public function price()\n    {\n        return 5;\n    }\n}"
  },
  {
    "path": "Decorator/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Decorator;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Decorator\n */\nclass Client\n{\n    /**\n     *\n     */\n    public function run()\n    {\n        // 手抓饼\n        $shouzhuabing = new Shouzhuabing();\n        echo $shouzhuabing->name();\n        echo $shouzhuabing->price() . '元';\n        echo '<hr>';\n\n        // 烤冷面\n        $kaolengmian = new Kaolengmian();\n        echo $kaolengmian->name();\n        echo $kaolengmian->price() . '元';\n        echo '<hr>';\n\n        // 手抓饼+蛋\n        $egg = new Egg($shouzhuabing);\n        echo $egg->name();\n        echo $egg->price() . '元';\n        echo '<hr>';\n\n        // 手抓饼+肠\n        $sausage = new Sausage($kaolengmian);\n        echo $sausage->name();\n        echo $sausage->price() . '元';\n        echo '<hr>';\n\n        // 烤冷面+辣条\n        $latiao = new Latiao($shouzhuabing);\n        echo $latiao->name();\n        echo $latiao->price() . '元';\n        echo '<hr>';\n    }\n}\n\n$client = new Client();\n$client->run();\n"
  },
  {
    "path": "Facade/Encrypt.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Facade;\n\n/**\n * 加密类\n *\n * @package Baijunyao\\DesignPatterns\\Facade\n */\nclass Encrypt\n{\n    /**\n     * 加密\n     */\n    public function encrypt()\n    {\n        return '加密';\n    }\n}"
  },
  {
    "path": "Facade/Facade.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Facade;\n\n/**\n * Facade\n *\n * @package Baijunyao\\DesignPatterns\\Facade\n */\nclass Facade\n{\n    /**\n     * @var \\Baijunyao\\DesignPatterns\\Facade\\File\n     */\n    private $file;\n\n    /**\n     * @var \\Baijunyao\\DesignPatterns\\Facade\\Encrypt\n     */\n    private $encrypt;\n\n    /**\n     * Facade constructor.\n     */\n    public function __construct()\n    {\n        $this->file = new File();\n        $this->encrypt = new Encrypt();\n    }\n\n    /**\n     * 获取文件内容并加密\n     */\n    public function encryptContent()\n    {\n        echo $this->file->content();\n        echo '<br>';\n        echo $this->encrypt->encrypt();\n    }\n}\n"
  },
  {
    "path": "Facade/File.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Facade;\n\n/**\n * 文件类\n *\n * @package Baijunyao\\DesignPatterns\\Facade\n */\nclass File\n{\n    /**\n     * 获取文件内容\n     */\n    public function content()\n    {\n        return '获取文件内容';\n    }\n}"
  },
  {
    "path": "Facade/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Facade;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Facade\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $facade = new Facade();\n        $facade->encryptContent();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "FactoryMethod/Add.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 加法\n *\n * Class Add\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass Add extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return int\n     */\n    public function getResult()\n    {\n        return $this->numberA + $this->numberB;\n    }\n}"
  },
  {
    "path": "FactoryMethod/AddFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 加法工厂\n *\n * Class AddFactory\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass AddFactory extends Factory\n{\n    /**\n     * 创建加法产品类\n     *\n     * @return Add\n     */\n    public function create()\n    {\n        return new Add();\n    }\n}"
  },
  {
    "path": "FactoryMethod/Div.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 除法\n *\n * Class Div\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass Div extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return float|int\n     */\n    public function getResult()\n    {\n        if ($this->numberB == 0) {\n            throw new \\InvalidArgumentException('除数不能为0');\n        }\n        return $this->numberA / $this->numberB;\n    }\n}"
  },
  {
    "path": "FactoryMethod/DivFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 除法工厂\n *\n * Class DivFactory\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass DivFactory extends Factory\n{\n    /**\n     * 创建除法产品类\n     *\n     * @return Div\n     */\n    public function create()\n    {\n        return new Div();\n    }\n}"
  },
  {
    "path": "FactoryMethod/Factory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 工厂抽象类\n *\n * Class Factory\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nabstract class Factory\n{\n    /**\n     * 创建产品\n     *\n     * @return mixed\n     */\n    abstract public function create();\n}"
  },
  {
    "path": "FactoryMethod/Mul.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 乘法\n *\n * Class Mul\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass Mul extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return float|int\n     */\n    public function getResult()\n    {\n        return $this->numberA * $this->numberB;\n    }\n}"
  },
  {
    "path": "FactoryMethod/MulFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 乘法工厂\n *\n * Class MulFactory\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass MulFactory extends Factory\n{\n    /**\n     * 创建乘法产品类\n     *\n     * @return Mul\n     */\n    public function create()\n    {\n        return new Mul();\n    }\n}"
  },
  {
    "path": "FactoryMethod/Operation.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 操作类型抽象类\n *\n * Class Operation\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nabstract class Operation\n{\n    /**\n     * 运算符号左边的值\n     *\n     * @var int\n     */\n    protected $numberA = 0;\n\n    /**\n     * 运算符号右边的值\n     *\n     * @var int\n     */\n    protected $numberB = 0;\n\n    /**\n     * 计算结果\n     *\n     * @return mixed\n     */\n    abstract public function getResult();\n\n    /**\n     * 给 numberA 赋值\n     *\n     * @param $number\n     */\n    public function setNumberA($number)\n    {\n        $this->numberA = $number;\n    }\n\n    /**\n     * 给 numberB 赋值\n     *\n     * @param $number\n     */\n    public function setNumberB($number)\n    {\n        $this->numberB = $number;\n    }\n\n}"
  },
  {
    "path": "FactoryMethod/Sub.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 减法\n *\n * Class Sub\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass Sub extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return int|mixed\n     */\n    public function getResult()\n    {\n        return $this->numberA - $this->numberB;\n    }\n}"
  },
  {
    "path": "FactoryMethod/SubFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\n/**\n * 减法工厂\n *\n * Class SubFactory\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass SubFactory extends Factory\n{\n    /**\n     * 创建减法产品类\n     *\n     * @return Sub\n     */\n    public function create()\n    {\n        return new Sub();\n    }\n}"
  },
  {
    "path": "FactoryMethod/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\FactoryMethod;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\FactoryMethod\n */\nclass Client\n{\n    /**\n     * 不好的示例   直接 new 具体的产品\n     */\n    public function bad()\n    {\n        // 计算 1+2\n        $operation = new Add();\n        $operation->setNumberA(1);\n        $operation->setNumberB(2);\n        $result = $operation->getResult();\n        echo $result;\n\n        echo '<br>';\n\n        // 计算 3+4\n        $operation = new Add();\n        $operation->setNumberA(3);\n        $operation->setNumberB(4);\n        $result = $operation->getResult();\n        echo $result;\n    }\n\n    /**\n     * 好的示例  new 产品对应的工厂\n     */\n    public function good()\n    {\n        $factory = new AddFactory();\n        $operation = $factory->create();\n        $operation->setNumberA(1);\n        $operation->setNumberB(2);\n        $result = $operation->getResult();\n        echo $result;\n    }\n}\n\n\n$client = new Client();\n$client->bad();\necho '<br>';\n$client->good();"
  },
  {
    "path": "Flyweight/ConcreteFlyweight.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Flyweight;\n\n/**\n * 共享的具体享元类\n *\n * Class ConcreteFlyweight\n *\n * @package Baijunyao\\DesignPatterns\\Flyweight\n */\nclass ConcreteFlyweight extends Flyweight\n{\n    /**\n     * @param $content\n     */\n    public function show($content)\n    {\n        echo '共享的享元：' . $this->name . $content . '<br>';\n    }\n}"
  },
  {
    "path": "Flyweight/Flyweight.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Flyweight;\n\n/**\n * 享元抽象类\n *\n * Class Flyweight\n *\n * @package Baijunyao\\DesignPatterns\\Flyweight\n */\nabstract class Flyweight\n{\n    /**\n     * @var\n     */\n    protected $name;\n\n    /**\n     * Flyweight constructor.\n     *\n     * @param $name\n     */\n    public function __construct($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @param $content\n     */\n    public function show($content){}\n}\n\n"
  },
  {
    "path": "Flyweight/FlyweightFactory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Flyweight;\n\n/**\n * 享元工厂\n *\n * Class FlyweightFactory\n *\n * @package Baijunyao\\DesignPatterns\\Flyweight\n */\nclass FlyweightFactory\n{\n    /**\n     * @var array\n     */\n    private $flyweights = [];\n\n    /**\n     * @param $name\n     *\n     * @return mixed\n     */\n    public function getFlyweight($name)\n    {\n        if(!isset($this->flyweights[$name])){\n            $this->flyweights[$name]=new ConcreteFlyweight($name);\n        }\n        return $this->flyweights[$name];\n    }\n}"
  },
  {
    "path": "Flyweight/UnsharedConcreteFlyweight.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Flyweight;\n\n/**\n * 不共享的具体享元类\n *\n * Class UnsharedConcreteFlyweight\n *\n * @package Baijunyao\\DesignPatterns\\Flyweight\n */\nclass UnsharedConcreteFlyweight extends Flyweight\n{\n    /**\n     * @param $content\n     */\n    public function show($content)\n    {\n        echo '不共享的享元：' . $this->name . $content . '<br>';\n    }\n\n    /**\n     * 附加的删除方法\n     */\n    public function delete()\n    {\n        $this->name = '';\n    }\n}"
  },
  {
    "path": "Flyweight/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Flyweight;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Flyweight\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $flyweight = new FlyweightFactory();\n        $zhangsan1 = $flyweight->getFlyweight('170cm的模特');\n        $zhangsan1->show('第1件L号的衣服');\n\n        $zhangsan2 = $flyweight->getFlyweight('170cm的模特');\n        $zhangsan2->show('第99件L号的衣服');\n\n        var_dump($zhangsan1 === $zhangsan2);\n        echo '<hr>';\n\n        $lisi = $flyweight->getFlyweight('180cm的模特');\n        $lisi->show('第1件XXL号的衣服');\n\n        $wangmazi = new UnsharedConcreteFlyweight('190cm的模特');\n        $wangmazi->show('第1件XXXL号的衣服');\n        $wangmazi->delete();\n        $wangmazi->show('第1件XXXL号的衣服');\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Iterator/ContainerInterface.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Iterator;\n\n/**\n * 容器接口\n *\n * @package Baijunyao\\DesignPatterns\\Iterator\n */\ninterface ContainerInterface\n{\n    /**\n     * 增加一个名字\n     *\n     * @param $name\n     *\n     * @return mixed\n     */\n    public function add($name);\n\n    /**\n     * 获取迭代器\n     *\n     * @return mixed\n     */\n    public function getIterator();\n}"
  },
  {
    "path": "Iterator/IteratorInterface.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Iterator;\n\n/**\n * 迭代器接口\n *\n * @package Baijunyao\\DesignPatterns\\Iterator\n */\ninterface IteratorInterface\n{\n    /**\n     * 判断是否还有下一个\n     *\n     * @return mixed\n     */\n    public function hasNext();\n\n    /**\n     * 获取下一个\n     *\n     * @return mixed\n     */\n    public function next();\n}"
  },
  {
    "path": "Iterator/NameContainer.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Iterator;\n\n/**\n * 姓名容器\n *\n * @package Baijunyao\\DesignPatterns\\Iterator\n */\nclass NameContainer implements ContainerInterface\n{\n    /**\n     * @var array\n     */\n    protected $nameArray = [];\n\n    /**\n     * 增加一个名字\n     *\n     * @param $name\n     *\n     * @return mixed|void\n     */\n    public function add($name)\n    {\n        $this->nameArray[] = $name;\n    }\n\n    /**\n     * 获取迭代器\n     *\n     * @return \\Baijunyao\\DesignPatterns\\Iterator\\NameIterator|mixed\n     */\n    public function getIterator()\n    {\n        return new NameIterator($this->nameArray);\n    }\n}"
  },
  {
    "path": "Iterator/NameIterator.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Iterator;\n\n/**\n * 姓名迭代器\n *\n * @package Baijunyao\\DesignPatterns\\Iterator\n */\nclass NameIterator implements IteratorInterface\n{\n    /**\n     * @var array\n     */\n    protected $nameArray = [];\n\n    /**\n     * @var int\n     */\n    protected $index = 0;\n\n    /**\n     * NameIterator constructor.\n     *\n     * @param $nameArray\n     */\n    public function __construct($nameArray)\n    {\n        $this->nameArray = $nameArray;\n    }\n\n    /**\n     * 判断是否还有下一个姓名\n     *\n     * @return bool|mixed\n     */\n    public function hasNext()\n    {\n        return $this->index < count($this->nameArray);\n    }\n\n    /**\n     * 下一个姓名\n     *\n     * @return mixed|void\n     */\n    public function next()\n    {\n        if ($this->hasNext()) {\n            echo $this->nameArray[$this->index] . '<br>';\n            $this->index++;\n        }\n    }\n}"
  },
  {
    "path": "Iterator/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Iterator;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Iterator\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $nameContainer = new NameContainer();\n        $nameContainer->add('张三');\n        $nameContainer->add('李四');\n        $nameContainer->add('王麻子');\n\n        $nameIterator = $nameContainer->getIterator();\n\n        while ($nameIterator->hasNext()) {\n            echo $nameIterator->next();\n        }\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "ObjectAdapter/Adaptee.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ObjectAdapter;\n\n/**\n * 源类\n *\n * Class Target\n * @package Baijunyao\\DesignPatterns\\ObjectAdapter\n */\nclass Adaptee\n{\n    /**\n     * 金额\n     *\n     * @var string\n     */\n    public $money = '￥34';\n\n    /**\n     * 支付\n     */\n    public function pay()\n    {\n        echo '支付' . $this->money;\n    }\n}"
  },
  {
    "path": "ObjectAdapter/Adapter.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ObjectAdapter;\n\n/**\n * 适配器\n *\n * Class Adapter\n * @package Baijunyao\\DesignPatterns\\ObjectAdapter\n */\n\nclass Adapter implements Target\n{\n\n    /**\n     * Adapter constructor.\n     * @param Adaptee $adaptee\n     */\n    public function __construct(Adaptee $adaptee)\n    {\n        $this->adaptee = $adaptee;\n        $adaptee->money = '$5';\n    }\n\n    /**\n     * 支付\n     *\n     * @return mixed|void\n     */\n    public function pay()\n    {\n        $this->adaptee->pay();\n    }\n\n    /**\n     * 通知\n     *\n     * @return mixed|void\n     */\n    public function notify()\n    {\n        echo '通知';\n    }\n}"
  },
  {
    "path": "ObjectAdapter/Target.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ObjectAdapter;\n\n/**\n * 目标类接口\n *\n * Interface Target\n * @package Baijunyao\\DesignPatterns\\ObjectAdapter\n */\ninterface Target\n{\n    /**\n     * 支付\n     *\n     * @return mixed\n     */\n    public function pay();\n\n    /**\n     * 通知\n     *\n     * @return mixed\n     */\n    public function notify();\n}\n"
  },
  {
    "path": "ObjectAdapter/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\ObjectAdapter;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\ObjectAdapter\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        // 原本的类的\n        $adaptee = new Adaptee();\n        $adaptee->pay();\n        echo '<br>';\n\n        // 适配器\n        $adapter = new Adapter($adaptee);\n        $adapter->pay();\n        echo '<br>';\n\n        $adapter->notify();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Observer/EmailObserver.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\n/**\n * 发邮件\n *\n * @package Baijunyao\\DesignPatterns\\Observer\n */\nclass EmailObserver implements Observer\n{\n    /**\n     * 执行操作\n     */\n    public function update()\n    {\n        echo '发送邮件昭告天下<br>';\n    }\n}"
  },
  {
    "path": "Observer/Observer.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\n/**\n * Observer 接口\n *\n * @package Baijunyao\\DesignPatterns\\Observer\n */\ninterface Observer\n{\n    /**\n     * @return mixed\n     */\n    public function update();\n}"
  },
  {
    "path": "Observer/SMSObserver.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\n/**\n * 发短信\n *\n * @package Baijunyao\\DesignPatterns\\Observer\n */\nclass SMSObserver implements Observer\n{\n    /**\n     * 执行操作\n     */\n    public function update()\n    {\n        echo '发送短信昭告天下<br>';\n    }\n}"
  },
  {
    "path": "Observer/Subject.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\n/**\n * 具体 Subject\n *\n * @package Baijunyao\\DesignPatterns\\Observer\n */\nclass Subject extends SubjectAbstract\n{\n    public function publish()\n    {\n        echo '我做了某事<br>';\n        $this->notify();\n    }\n}"
  },
  {
    "path": "Observer/SubjectAbstract.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\n/**\n * Observer 抽象类\n *\n * @package Baijunyao\\DesignPatterns\\Observer\n */\nabstract class SubjectAbstract\n{\n    /**\n     * @var array\n     */\n    private $observers = [];\n\n    /**\n     * @param \\Baijunyao\\DesignPatterns\\Observer\\Observer $observer\n     */\n    public function attach(Observer $observer)\n    {\n        $this->observers[] = $observer;\n    }\n\n    /**\n     * 通知\n     */\n    public function notify()\n    {\n        foreach ($this->observers as $k => $v) {\n            $v->update();\n        }\n    }\n}"
  },
  {
    "path": "Observer/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Observer;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Observer\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $emailObserver = new EmailObserver();\n        $SMSObserver = new SMSObserver();\n        $subject = new Subject();\n\n        $subject->attach($emailObserver);\n        $subject->attach($SMSObserver);\n        $subject->publish();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "Prototype/Car.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Prototype;\n\n/**\n * Class Car\n * @package Baijunyao\\DesignPatterns\\Prototype\n */\nclass Car\n{\n    /**\n     * 车名\n     *\n     * @var\n     */\n    public $name;\n\n    /**\n     * 设置车名\n     *\n     * @param $name\n     */\n    public function setName($name)\n    {\n        $this->name = $name;\n    }\n}"
  },
  {
    "path": "Prototype/DeepDrive.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Prototype;\n\n/**\n * Class DeepDrive\n * @package Baijunyao\\DesignPatterns\\Prototype\n */\nclass DeepDrive\n{\n\n    private $car;\n\n    /**\n     * Drive constructor.\n     */\n    public function __construct()\n    {\n        echo '准备完成';\n    }\n\n    /**\n     * 选择要开的车\n     *\n     * @param $car\n     */\n    public function setCar($car)\n    {\n        $this->car = $car;\n    }\n\n    public function show()\n    {\n        echo '开始驾驶'.$this->car->name;\n        echo '<br>';\n    }\n\n    public function __clone()\n    {\n        $this->car = clone $this->car;\n    }\n}"
  },
  {
    "path": "Prototype/ShallowDrive.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Prototype;\n\n/**\n * Class ShallowDrive\n * @package Baijunyao\\DesignPatterns\\Prototype\n */\nclass ShallowDrive\n{\n\n    private $car;\n\n    /**\n     * Drive constructor.\n     */\n    public function __construct()\n    {\n        echo '准备完成';\n    }\n\n    /**\n     * 选择要开的车\n     *\n     * @param $car\n     */\n    public function setCar($car)\n    {\n        $this->car = $car;\n    }\n\n    public function show()\n    {\n        echo '开始驾驶'.$this->car->name;\n        echo '<br>';\n    }\n}"
  },
  {
    "path": "Prototype/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Prototype;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Prototype\n */\nclass Client\n{\n    /**\n     * 浅复制\n     */\n    public function shallowCopy()\n    {\n        $car = new Car();\n        $car->name = '特斯拉';\n\n        $shallowDrive = new ShallowDrive();\n        $shallowDrive->setCar($car);\n        $shallowDrive->show();\n\n        $cloneDrive = clone $shallowDrive;\n        $cloneDrive->show();\n\n        echo '<hr>';\n\n        $car->name = '凯迪拉克';\n        $shallowDrive->show();\n        $cloneDrive->show();\n    }\n\n    /**\n     *\n     */\n    public function deepCopy()\n    {\n        $car = new Car();\n        $car->name = '特斯拉';\n\n        $deepDrive = new DeepDrive();\n        $deepDrive->setCar($car);\n        $deepDrive->show();\n\n        $cloneDrive = clone $deepDrive;\n        $cloneDrive->show();\n\n        echo '<hr>';\n\n        $car->name = '凯迪拉克';\n        $deepDrive->show();\n        $cloneDrive->show();\n    }\n}\n\n$client = new Client();\n$client->shallowCopy();\necho '<br>-----------------------------<br>';\n$client->deepCopy();"
  },
  {
    "path": "Proxy/Proxy.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Proxy;\n\n/**\n * 代理\n *\n * Class Proxy\n *\n * @package Baijunyao\\DesignPatterns\\Proxy\n */\nclass Proxy implements Subject\n{\n    /**\n     * 真实主题\n     *\n     * @var \\Baijunyao\\DesignPatterns\\Proxy\\RealSubject\n     */\n    protected $realSubject;\n\n    /**\n     * Proxy constructor.\n     */\n    public function __construct()\n    {\n        $this->realSubject = new RealSubject();\n    }\n\n    /*\n     * 执行操作\n     */\n    public function action()\n    {\n        $this->realSubject->action();\n    }\n\n}"
  },
  {
    "path": "Proxy/RealSubject.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Proxy;\n\n/**\n * 真实主题\n *\n * Class RealSubject\n *\n * @package Baijunyao\\DesignPatterns\\Proxy\n */\nclass RealSubject implements Subject\n{\n    /**\n     * 执行操作\n     */\n    public function action()\n    {\n        echo '执行操作';\n    }\n}"
  },
  {
    "path": "Proxy/Subject.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Proxy;\n\n/**\n * \n *\n * Interface Subject\n *\n * @package Baijunyao\\DesignPatterns\\Proxy\n */\ninterface Subject\n{\n    public function action();\n}"
  },
  {
    "path": "Proxy/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Proxy;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Proxy\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $proxy = new Proxy();\n        $proxy->action();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "SafeComposite/Component.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SafeComposite;\n\n/**\n * 只包含树枝节点和叶子节点公共的方法抽象类\n *\n * Class Component\n * @package Baijunyao\\DesignPatterns\\SafeComposite\n */\nabstract class Component\n{\n    /**\n     * @var\n     */\n    protected $name;\n\n    /**\n     * Component constructor.\n     * @param $name\n     */\n    public function __construct($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * @return mixed\n     */\n    abstract public function display();\n}"
  },
  {
    "path": "SafeComposite/Dir.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SafeComposite;\n\n/**\n * 文件夹\n *\n * Class Dir\n * @package Baijunyao\\DesignPatterns\\SafeComposite\n */\nclass Dir extends Component\n{\n    /**\n     * @var array\n     */\n    protected $children = [];\n\n    /**\n     * 添加子节点\n     *\n     * @param Component $component\n     */\n    public function add(Component $component)\n    {\n        $this->children[] = $component;\n    }\n\n    /**\n     * @return mixed|string\n     */\n    public function display()\n    {\n        $nameStr = $this->name .'<br>';\n        foreach ($this->children as $k => $v) {\n\n            $nameStr .= '--' . $v->display();\n        }\n        return $nameStr;\n    }\n}"
  },
  {
    "path": "SafeComposite/File.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SafeComposite;\n\n/**\n * 文件\n *\n * Class File\n * @package Baijunyao\\DesignPatterns\\SafeComposite\n */\nclass File extends Component\n{\n    /**\n     * @return mixed|string\n     */\n    public function display()\n    {\n        return '--' . $this->name .'<br>';\n    }\n}"
  },
  {
    "path": "SafeComposite/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SafeComposite;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\SafeComposite\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $designPatterns = new Dir('design-patterns');\n\n        $classAdapter = new Dir('ClassAdapter');\n        $objectAdapter = new Dir('ObjectAdapter');\n        $safeComposite = new Dir('SafeComposite');\n\n        $designPatterns->add($classAdapter);\n        $designPatterns->add($objectAdapter);\n        $designPatterns->add($safeComposite);\n\n        $componentFile = new File('Component.php');\n        $dirFile = new File('Dir.php');\n        $fileFile = new File('File.php');\n        $indexFile = new File('index.php');\n\n        $safeComposite->add($componentFile);\n        $safeComposite->add($dirFile);\n        $safeComposite->add($fileFile);\n        $safeComposite->add($indexFile);\n\n        echo $designPatterns->display();\n    }\n}\n\n$client = new Client();\n$client->run();\n"
  },
  {
    "path": "SimpleFactory/Add.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 加法\n *\n * Class Add\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Add extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return int\n     */\n    public function getResult()\n    {\n        return $this->numberA + $this->numberB;\n    }\n}"
  },
  {
    "path": "SimpleFactory/Bad.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 不好的示例\n *\n * Class Bad\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Bad\n{\n    /**\n     * 计算结果\n     *\n     * @param int $numberA\n     * @param string $operate\n     * @param int $numberB\n     * @return int|float|int\n     */\n    public function getResult($numberA, $operate, $numberB)\n    {\n        switch ($operate) {\n            case '+':\n                $result = $numberA + $numberB;\n                break;\n            case '-':\n                $result = $numberA - $numberB;\n                break;\n            case '*':\n                $result = $numberA * $numberB;\n                break;\n            case '/':\n                if ($numberB != 0) {\n                    $result = $numberA / $numberB;\n                } else {\n                    throw new \\InvalidArgumentException('除数不能为0');\n                }\n                break;\n            default:\n                throw new \\InvalidArgumentException('暂不支持的运算');\n        }\n        return $result;\n    }\n}"
  },
  {
    "path": "SimpleFactory/Div.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 除法\n *\n * Class Div\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Div extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return float|int\n     */\n    public function getResult()\n    {\n        if ($this->numberB == 0) {\n            throw new \\InvalidArgumentException('除数不能为0');\n        }\n        return $this->numberA / $this->numberB;\n    }\n}"
  },
  {
    "path": "SimpleFactory/Factory.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 工厂类\n *\n * Class Factory\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Factory\n{\n    /**\n     * 创建一种运算\n     *\n     * @param $operate\n     * @return Add|Div|Mul|Sub\n     */\n    public function create($operate)\n    {\n        switch ($operate) {\n            case '+':\n                $result = new Add();\n                break;\n            case '-':\n                $result = new Sub();\n                break;\n            case '*':\n                $result = new Mul();\n                break;\n            case '/':\n                $result = new Div();\n                break;\n            default:\n                throw new \\InvalidArgumentException('暂不支持的运算');\n        }\n        return $result;\n    }\n}"
  },
  {
    "path": "SimpleFactory/Mul.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 乘法\n *\n * Class Mul\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Mul extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return float|int\n     */\n    public function getResult()\n    {\n        return $this->numberA * $this->numberB;\n    }\n}"
  },
  {
    "path": "SimpleFactory/Operation.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 操作类型抽象类\n *\n * Class Operation\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nabstract class Operation\n{\n    /**\n     * 运算符号左边的值\n     *\n     * @var int\n     */\n    protected $numberA = 0;\n\n    /**\n     * 运算符号右边的值\n     *\n     * @var int\n     */\n    protected $numberB = 0;\n\n    /**\n     * 计算结果\n     *\n     * @return mixed\n     */\n    abstract public function getResult();\n\n    /**\n     * 给 numberA 赋值\n     *\n     * @param $number\n     */\n    public function setNumberA($number)\n    {\n        $this->numberA = $number;\n    }\n\n    /**\n     * 给 numberB 赋值\n     *\n     * @param $number\n     */\n    public function setNumberB($number)\n    {\n        $this->numberB = $number;\n    }\n\n}"
  },
  {
    "path": "SimpleFactory/Sub.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\n/**\n * 减法\n *\n * Class Sub\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Sub extends Operation\n{\n    /**\n     * 计算结果\n     *\n     * @return int|mixed\n     */\n    public function getResult()\n    {\n        return $this->numberA - $this->numberB;\n    }\n}"
  },
  {
    "path": "SimpleFactory/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\SimpleFactory;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\SimpleFactory\n */\nclass Client\n{\n    /**\n     * 不好的示例\n     */\n    public function bad()\n    {\n        $program = new Bad();\n        $result = $program->getResult(1, '+', 2);\n        echo $result;\n    }\n\n    /**\n     * 不好的示例2\n     *\n     * @return int\n     */\n    public function bad2()\n    {\n        // 计算 1+2\n        $operation = new Add();\n        $operation->setNumberA(1);\n        $operation->setNumberB(2);\n        $result = $operation->getResult();\n        echo $result;\n\n        echo '<br>';\n\n        // 计算 3+4\n        $operation = new Add();\n        $operation->setNumberA(3);\n        $operation->setNumberB(4);\n        $result = $operation->getResult();\n        echo $result;\n    }\n\n    /**\n     * 好的示例\n     */\n    public function good()\n    {\n        $factory = new Factory();\n        $operation = $factory->create('+');\n        $operation->setNumberA(1);\n        $operation->setNumberB(2);\n        $result = $operation->getResult();\n        echo $result;\n    }\n}\n\n\n$client = new Client();\n$client->bad();\necho '<br>';\n$client->bad2();\necho '<br>';\n$client->good();"
  },
  {
    "path": "Template/Huawei.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Template;\n\n/**\n * Class Huawei\n *\n * @package Baijunyao\\DesignPatterns\\Template\n */\nclass Huawei extends Phone\n{\n    /**\n     * 打电话\n     *\n     * @return mixed|void\n     */\n    protected function showLogo()\n    {\n        echo '华为logo'. '<br>';\n    }\n}"
  },
  {
    "path": "Template/Phone.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Template;\n\n/**\n * Class Phone\n *\n * @package Baijunyao\\DesignPatterns\\Template\n */\nabstract class Phone\n{\n    /**\n     * 定义操作顺序\n     */\n    final public function action()\n    {\n        $this->powerOn();\n        $this->showLogo();\n        $this->callUp();\n    }\n\n    /**\n     * 开机\n     */\n    protected function powerOn()\n    {\n        echo '开机' . '<br>';\n    }\n\n    /**\n     * logo\n     *\n     * @return mixed\n     */\n    abstract protected function showLogo();\n\n    /**\n     * 打电话\n     */\n    protected function callUp()\n    {\n        echo '打电话' . '<br>';\n    }\n}"
  },
  {
    "path": "Template/Xiaomi.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Template;\n\n/**\n * Class Xiaomi\n *\n * @package Baijunyao\\DesignPatterns\\Template\n */\nclass Xiaomi extends Phone\n{\n    /**\n     * logo\n     *\n     * @return mixed|void\n     */\n    protected function showLogo()\n    {\n        echo '小米logo'. '<br>';\n    }\n}"
  },
  {
    "path": "Template/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\Template;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\Template\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $xiaomi = new Xiaomi();\n        $xiaomi->action();\n\n        echo '<hr>';\n\n        $huawei = new Huawei();\n        $huawei->action();\n    }\n}\n\n$client = new Client();\n$client->run();"
  },
  {
    "path": "TransparentComposite/Component.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\TransparentComposite;\n\n/**\n * 包含树枝节点和叶子节点方法的抽象类\n *\n * Class Component\n * @package Baijunyao\\DesignPatterns\\TransparentComposite\n */\nabstract class Component\n{\n    /**\n     * @var\n     */\n    protected $name;\n\n    /**\n     * Component constructor.\n     * @param $name\n     */\n    public function __construct($name)\n    {\n        $this->name = $name;\n    }\n\n    /**\n     * 添加子节点\n     *\n     * @return mixed\n     */\n    abstract public function add();\n\n    /**\n     * 展示名称\n     *\n     * @return mixed\n     */\n    abstract public function display();\n}"
  },
  {
    "path": "TransparentComposite/Dir.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\TransparentComposite;\n\n/**\n * 文件夹\n *\n * Class Dir\n * @package Baijunyao\\DesignPatterns\\TransparentComposite\n */\nclass Dir extends Component\n{\n    /**\n     * @var array\n     */\n    protected $children = [];\n\n    /**\n     * 添加子节点\n     *\n     * @param Component $component\n     */\n    public function add(Component $component)\n    {\n        $this->children[] = $component;\n    }\n\n    /**\n     * @return mixed|string\n     */\n    public function display()\n    {\n        $nameStr = $this->name .'<br>';\n        foreach ($this->children as $k => $v) {\n\n            $nameStr .= '--' . $v->display();\n        }\n        return $nameStr;\n    }\n}"
  },
  {
    "path": "TransparentComposite/File.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\TransparentComposite;\n\n/**\n * 文件\n *\n * Class File\n * @package Baijunyao\\DesignPatterns\\TransparentComposite\n */\nclass File extends Component\n{\n    /**\n     * @param Component $component\n     * @throws \\Exception\n     */\n    public function add(Component $component)\n    {\n        throw new \\Exception('文件不能添加子节点');\n    }\n\n    /**\n     * @return mixed|string\n     */\n    public function display()\n    {\n        return '--' . $this->name .'<br>';\n    }\n}"
  },
  {
    "path": "TransparentComposite/index.php",
    "content": "<?php\n\nnamespace Baijunyao\\DesignPatterns\\TransparentComposite;\n\nrequire __DIR__.'/../vendor/autoload.php';\n\n/**\n * 客户端\n *\n * Class Client\n * @package Baijunyao\\DesignPatterns\\TransparentComposite\n */\nclass Client\n{\n    /**\n     * 运行\n     */\n    public function run()\n    {\n        $designPatterns = new Dir('design-patterns');\n\n        $classAdapter = new Dir('ClassAdapter');\n        $objectAdapter = new Dir('ObjectAdapter');\n        $transparentComposite = new Dir('TransparentComposite');\n\n        $designPatterns->add($classAdapter);\n        $designPatterns->add($objectAdapter);\n        $designPatterns->add($transparentComposite);\n\n        $componentFile = new File('Component.php');\n        $dirFile = new File('Dir.php');\n        $fileFile = new File('File.php');\n        $indexFile = new File('index.php');\n\n        $transparentComposite->add($componentFile);\n        $transparentComposite->add($dirFile);\n        $transparentComposite->add($fileFile);\n        $transparentComposite->add($indexFile);\n\n        echo $designPatterns->display();\n    }\n}\n\n$client = new Client();\n$client->run();\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"baijunyao/design-patterns\",\n    \"description\": \"design patterns\",\n    \"type\": \"project\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"baijunyao\",\n            \"email\": \"baijunyao@baijunyao.com\"\n        }\n    ],\n    \"require\": {},\n    \"autoload\": {\n        \"psr-4\": {\n            \"Baijunyao\\\\DesignPatterns\\\\\": \"\"\n        }\n    }\n}\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>设计模式-白俊遥</title>\n</head>\n<body marginheight=\"0\">\n    <h3>文章</h3>\n    <ol>\n        <li><a href=\"https://baijunyao.com/article/158\">php设计模式(一)序言</a></li>\n        <li><a href=\"https://baijunyao.com/article/159\">php设计模式(二)单例模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/161\">php设计模式(三)简单工厂模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/162\">php设计模式(四)工厂方法模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/164\">php设计模式(五)抽象工厂模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/165\">php设计模式(六)使用简单工厂来优化抽象工厂模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/166\">php设计模式(七)使用反射来优化抽象工厂模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/167\">php设计模式(八)原型模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/168\">php设计模式(九)类适配器模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/169\">php设计模式(十)对象适配器模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/170\">php设计模式(十一)桥接模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/172\">php设计模式(十二)装饰模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/174\">php设计模式(十三)透明组合模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/175\">php设计模式(十四)安全组合模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/176\">php设计模式(十五)外观模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/177\">php设计模式(十六)享元模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/178\">php设计模式(十七)代理模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/179\">php设计模式(十八)代理模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/182\">php设计模式(十九)命令模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/183\">php设计模式(二十)迭代器模式</a></li>\n        <li><a href=\"https://baijunyao.com/article/184\">php设计模式(二十一)观察者模式</a></li>\n    </ol>\n    <h3>目录</h3>\n    <ul>\n        <li><a href=\"/singleton\">单例模式</a></li>\n        <li><a href=\"/SimpleFactory\">简单工厂模式</a></li>\n        <li><a href=\"/FactoryMethod\">工厂方法模式</a></li>\n        <li><a href=\"/AbstractFactory\">抽象工厂模式</a></li>\n        <li><a href=\"/AbstractFactoryWithSimpleFactory\">使用简单工厂来优化抽象工厂模式</a></li>\n        <li><a href=\"/AbstractFactoryWithReflection\">使用反射来优化抽象工厂模式</a></li>\n        <li><a href=\"/Prototype\">原型模式</a></li>\n        <li><a href=\"/ClassAdapter\">类适配器</a></li>\n        <li><a href=\"/ObjectAdapter\">对象适配器模式</a></li>\n        <li><a href=\"/Bridge\">桥接模式</a></li>\n        <li><a href=\"/Decorator\">装饰模式</a></li>\n        <li><a href=\"/TransparentComposite\">透明组合模式</a></li>\n        <li><a href=\"/SafeComposite\">安全组合模式</a></li>\n        <li><a href=\"/Facade\">外观模式</a></li>\n        <li><a href=\"/Flyweight\">享元模式</a></li>\n        <li><a href=\"/Proxy\">代理模式</a></li>\n        <li><a href=\"/Template\">代理模式</a></li>\n        <li><a href=\"/Command\">命令模式</a></li>\n        <li><a href=\"/Iterator\">迭代器模式</a></li>\n        <li><a href=\"/Observer\">迭代器模式</a></li>\n    </ul>\n</body>\n</html>"
  },
  {
    "path": "readme.md",
    "content": "### 文章\n1. [php设计模式(一)序言](https://baijunyao.com/article/158)\n2. [php设计模式(二)单例模式](https://baijunyao.com/article/159)\n3. [php设计模式(三)简单工厂模式](https://baijunyao.com/article/161)\n4. [php设计模式(四)工厂方法模式](https://baijunyao.com/article/162)\n5. [php设计模式(五)抽象工厂模式](https://baijunyao.com/article/164)\n6. [php设计模式(六)使用简单工厂来优化抽象工厂模式](https://baijunyao.com/article/165)\n7. [php设计模式(七)使用反射来优化抽象工厂模式](https://baijunyao.com/article/166)\n8. [php设计模式(八)原型模式](https://baijunyao.com/article/167)\n9. [php设计模式(九)类适配器模式](https://baijunyao.com/article/168)\n10. [php设计模式(十)对象适配器模式](https://baijunyao.com/article/169)\n11. [php设计模式(十一)桥接模式](https://baijunyao.com/article/170)\n12. [php设计模式(十二)装饰模式](https://baijunyao.com/article/172)\n13. [php设计模式(十三)透明组合模式](https://baijunyao.com/article/174)\n14. [php设计模式(十四)安全组合模式](https://baijunyao.com/article/175)\n15. [php设计模式(十五)外观模式](https://baijunyao.com/article/176)\n16. [php设计模式(十六)享元模式](https://baijunyao.com/article/177)\n17. [php设计模式(十七)代理模式](https://baijunyao.com/article/178)\n18. [php设计模式(十八)模板方法模式](https://baijunyao.com/article/179)\n19. [php设计模式(十九)命令模式](https://baijunyao.com/article/182)\n20. [php设计模式(二十)迭代器模式](https://baijunyao.com/article/183)\n21. [php设计模式(二十一)观察者模式](https://baijunyao.com/article/184)\n\n### 目录\n- [单例模式](https://github.com/baijunyao/design-patterns/tree/master/singleton)\n- [简单工厂模式](https://github.com/baijunyao/design-patterns/tree/master/SimpleFactory)\n- [工厂方法模式](https://github.com/baijunyao/design-patterns/tree/master/FactoryMethod)\n- [抽象工厂模式](https://github.com/baijunyao/design-patterns/tree/master/AbstractFactory)\n- [使用简单工厂来优化抽象工厂模式](https://github.com/baijunyao/design-patterns/tree/master/AbstractFactoryWithSimpleFactory)\n- [使用反射来优化抽象工厂模式](https://github.com/baijunyao/design-patterns/tree/master/AbstractFactoryWithReflection)\n- [原型模式](https://github.com/baijunyao/design-patterns/tree/master/Prototype)\n- [类适配器模式](https://github.com/baijunyao/design-patterns/tree/master/ClassAdapter)\n- [对象适配器模式](https://github.com/baijunyao/design-patterns/tree/master/ObjectAdapter)\n- [桥接模式](https://github.com/baijunyao/design-patterns/tree/master/Bridge)\n- [装饰模式](https://github.com/baijunyao/design-patterns/tree/master/Decorator)\n- [透明组合模式](https://github.com/baijunyao/design-patterns/tree/master/TransparentComposite)\n- [安全组合模式](https://github.com/baijunyao/design-patterns/tree/master/SafeComposite)\n- [外观模式](https://github.com/baijunyao/design-patterns/tree/master/Facade)\n- [享元模式](https://github.com/baijunyao/design-patterns/tree/master/Flyweight)\n- [代理模式](https://github.com/baijunyao/design-patterns/tree/master/Proxy)\n- [模板方法模式](https://github.com/baijunyao/design-patterns/tree/master/Template)\n- [命令模式](https://github.com/baijunyao/design-patterns/tree/master/Command)\n- [迭代器模式](https://github.com/baijunyao/design-patterns/tree/master/Iterator)\n- [观察者模式](https://github.com/baijunyao/design-patterns/tree/master/Observer)\n"
  },
  {
    "path": "singleton/index.php",
    "content": "<?php\nnamespace Baijunyao\\DesignPatterns\\Singleton;\n\n/**\n * 普通类\n *\n * Class Db1\n * @package Baijunyao\\DesignPatterns\\Singleton\n */\nclass Db1\n{\n    public static $instance = null;\n\n    public static function getInstance()\n    {\n        if (null === static::$instance) {\n            static::$instance = new static();\n        }\n\n        return static::$instance;\n    }\n\n    public function __construct()\n    {\n    }\n\n    public function __clone()\n    {\n    }\n\n    public function __wakeup()\n    {\n    }\n\n}\n$db1 = new Db1();\n$db2 = new Db1();\n$db3 = clone $db2;\n$db4 = Db1::getInstance();\n$db5 = unserialize(serialize($db4));\n\n\nvar_dump($db1);\necho '<hr>';\nvar_dump($db2);\necho '<hr>';\nvar_dump($db3);\necho '<hr>';\nvar_dump($db4);\necho '<hr>';\nvar_dump($db5);\necho '<hr>';\n\n\n/**\n * 单例\n *\n * Class Db2\n * @package Baijunyao\\DesignPatterns\\Singleton\n */\nclass Db2\n{\n    private static $instance = null;\n\n    public static function getInstance()\n    {\n        if (null === static::$instance) {\n            static::$instance = new static();\n        }\n\n        return static::$instance;\n    }\n\n    /**\n     * 防止使用 new 创建多个实例\n     *\n     * Db2 constructor.\n     */\n    private function __construct()\n    {\n    }\n\n    /**\n     * 防止 clone 多个实例\n     */\n    private function __clone()\n    {\n    }\n\n    /**\n     * 防止反序列化\n     */\n    private function __wakeup()\n    {\n    }\n}\n\n$db6 = Db2::getInstance();\n$db7 = Db2::getInstance();\n\nvar_dump($db6);\necho '<hr>';\nvar_dump($db7);\necho '<hr>';"
  },
  {
    "path": "vendor/autoload.php",
    "content": "<?php\n\n// autoload.php @generated by Composer\n\nrequire_once __DIR__ . '/composer/autoload_real.php';\n\nreturn ComposerAutoloaderInit88798c90f3cb8871fa59cc0f15b5142f::getLoader();\n"
  },
  {
    "path": "vendor/composer/ClassLoader.php",
    "content": "<?php\n\n/*\n * This file is part of Composer.\n *\n * (c) Nils Adermann <naderman@naderman.de>\n *     Jordi Boggiano <j.boggiano@seld.be>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nnamespace Composer\\Autoload;\n\n/**\n * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.\n *\n *     $loader = new \\Composer\\Autoload\\ClassLoader();\n *\n *     // register classes with namespaces\n *     $loader->add('Symfony\\Component', __DIR__.'/component');\n *     $loader->add('Symfony',           __DIR__.'/framework');\n *\n *     // activate the autoloader\n *     $loader->register();\n *\n *     // to enable searching the include path (eg. for PEAR packages)\n *     $loader->setUseIncludePath(true);\n *\n * In this example, if you try to use a class in the Symfony\\Component\n * namespace or one of its children (Symfony\\Component\\Console for instance),\n * the autoloader will first look for the class under the component/\n * directory, and it will then fallback to the framework/ directory if not\n * found before giving up.\n *\n * This class is loosely based on the Symfony UniversalClassLoader.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @see    http://www.php-fig.org/psr/psr-0/\n * @see    http://www.php-fig.org/psr/psr-4/\n */\nclass ClassLoader\n{\n    // PSR-4\n    private $prefixLengthsPsr4 = array();\n    private $prefixDirsPsr4 = array();\n    private $fallbackDirsPsr4 = array();\n\n    // PSR-0\n    private $prefixesPsr0 = array();\n    private $fallbackDirsPsr0 = array();\n\n    private $useIncludePath = false;\n    private $classMap = array();\n    private $classMapAuthoritative = false;\n    private $missingClasses = array();\n    private $apcuPrefix;\n\n    public function getPrefixes()\n    {\n        if (!empty($this->prefixesPsr0)) {\n            return call_user_func_array('array_merge', $this->prefixesPsr0);\n        }\n\n        return array();\n    }\n\n    public function getPrefixesPsr4()\n    {\n        return $this->prefixDirsPsr4;\n    }\n\n    public function getFallbackDirs()\n    {\n        return $this->fallbackDirsPsr0;\n    }\n\n    public function getFallbackDirsPsr4()\n    {\n        return $this->fallbackDirsPsr4;\n    }\n\n    public function getClassMap()\n    {\n        return $this->classMap;\n    }\n\n    /**\n     * @param array $classMap Class to filename map\n     */\n    public function addClassMap(array $classMap)\n    {\n        if ($this->classMap) {\n            $this->classMap = array_merge($this->classMap, $classMap);\n        } else {\n            $this->classMap = $classMap;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix, either\n     * appending or prepending to the ones previously set for this prefix.\n     *\n     * @param string       $prefix  The prefix\n     * @param array|string $paths   The PSR-0 root directories\n     * @param bool         $prepend Whether to prepend the directories\n     */\n    public function add($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            if ($prepend) {\n                $this->fallbackDirsPsr0 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr0\n                );\n            } else {\n                $this->fallbackDirsPsr0 = array_merge(\n                    $this->fallbackDirsPsr0,\n                    (array) $paths\n                );\n            }\n\n            return;\n        }\n\n        $first = $prefix[0];\n        if (!isset($this->prefixesPsr0[$first][$prefix])) {\n            $this->prefixesPsr0[$first][$prefix] = (array) $paths;\n\n            return;\n        }\n        if ($prepend) {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixesPsr0[$first][$prefix]\n            );\n        } else {\n            $this->prefixesPsr0[$first][$prefix] = array_merge(\n                $this->prefixesPsr0[$first][$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace, either\n     * appending or prepending to the ones previously set for this namespace.\n     *\n     * @param string       $prefix  The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths   The PSR-4 base directories\n     * @param bool         $prepend Whether to prepend the directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function addPsr4($prefix, $paths, $prepend = false)\n    {\n        if (!$prefix) {\n            // Register directories for the root namespace.\n            if ($prepend) {\n                $this->fallbackDirsPsr4 = array_merge(\n                    (array) $paths,\n                    $this->fallbackDirsPsr4\n                );\n            } else {\n                $this->fallbackDirsPsr4 = array_merge(\n                    $this->fallbackDirsPsr4,\n                    (array) $paths\n                );\n            }\n        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {\n            // Register directories for a new namespace.\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        } elseif ($prepend) {\n            // Prepend directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                (array) $paths,\n                $this->prefixDirsPsr4[$prefix]\n            );\n        } else {\n            // Append directories for an already registered namespace.\n            $this->prefixDirsPsr4[$prefix] = array_merge(\n                $this->prefixDirsPsr4[$prefix],\n                (array) $paths\n            );\n        }\n    }\n\n    /**\n     * Registers a set of PSR-0 directories for a given prefix,\n     * replacing any others previously set for this prefix.\n     *\n     * @param string       $prefix The prefix\n     * @param array|string $paths  The PSR-0 base directories\n     */\n    public function set($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr0 = (array) $paths;\n        } else {\n            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Registers a set of PSR-4 directories for a given namespace,\n     * replacing any others previously set for this namespace.\n     *\n     * @param string       $prefix The prefix/namespace, with trailing '\\\\'\n     * @param array|string $paths  The PSR-4 base directories\n     *\n     * @throws \\InvalidArgumentException\n     */\n    public function setPsr4($prefix, $paths)\n    {\n        if (!$prefix) {\n            $this->fallbackDirsPsr4 = (array) $paths;\n        } else {\n            $length = strlen($prefix);\n            if ('\\\\' !== $prefix[$length - 1]) {\n                throw new \\InvalidArgumentException(\"A non-empty PSR-4 prefix must end with a namespace separator.\");\n            }\n            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;\n            $this->prefixDirsPsr4[$prefix] = (array) $paths;\n        }\n    }\n\n    /**\n     * Turns on searching the include path for class files.\n     *\n     * @param bool $useIncludePath\n     */\n    public function setUseIncludePath($useIncludePath)\n    {\n        $this->useIncludePath = $useIncludePath;\n    }\n\n    /**\n     * Can be used to check if the autoloader uses the include path to check\n     * for classes.\n     *\n     * @return bool\n     */\n    public function getUseIncludePath()\n    {\n        return $this->useIncludePath;\n    }\n\n    /**\n     * Turns off searching the prefix and fallback directories for classes\n     * that have not been registered with the class map.\n     *\n     * @param bool $classMapAuthoritative\n     */\n    public function setClassMapAuthoritative($classMapAuthoritative)\n    {\n        $this->classMapAuthoritative = $classMapAuthoritative;\n    }\n\n    /**\n     * Should class lookup fail if not found in the current class map?\n     *\n     * @return bool\n     */\n    public function isClassMapAuthoritative()\n    {\n        return $this->classMapAuthoritative;\n    }\n\n    /**\n     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.\n     *\n     * @param string|null $apcuPrefix\n     */\n    public function setApcuPrefix($apcuPrefix)\n    {\n        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;\n    }\n\n    /**\n     * The APCu prefix in use, or null if APCu caching is not enabled.\n     *\n     * @return string|null\n     */\n    public function getApcuPrefix()\n    {\n        return $this->apcuPrefix;\n    }\n\n    /**\n     * Registers this instance as an autoloader.\n     *\n     * @param bool $prepend Whether to prepend the autoloader or not\n     */\n    public function register($prepend = false)\n    {\n        spl_autoload_register(array($this, 'loadClass'), true, $prepend);\n    }\n\n    /**\n     * Unregisters this instance as an autoloader.\n     */\n    public function unregister()\n    {\n        spl_autoload_unregister(array($this, 'loadClass'));\n    }\n\n    /**\n     * Loads the given class or interface.\n     *\n     * @param  string    $class The name of the class\n     * @return bool|null True if loaded, null otherwise\n     */\n    public function loadClass($class)\n    {\n        if ($file = $this->findFile($class)) {\n            includeFile($file);\n\n            return true;\n        }\n    }\n\n    /**\n     * Finds the path to the file where the class is defined.\n     *\n     * @param string $class The name of the class\n     *\n     * @return string|false The path if found, false otherwise\n     */\n    public function findFile($class)\n    {\n        // class map lookup\n        if (isset($this->classMap[$class])) {\n            return $this->classMap[$class];\n        }\n        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {\n            return false;\n        }\n        if (null !== $this->apcuPrefix) {\n            $file = apcu_fetch($this->apcuPrefix.$class, $hit);\n            if ($hit) {\n                return $file;\n            }\n        }\n\n        $file = $this->findFileWithExtension($class, '.php');\n\n        // Search for Hack files if we are running on HHVM\n        if (false === $file && defined('HHVM_VERSION')) {\n            $file = $this->findFileWithExtension($class, '.hh');\n        }\n\n        if (null !== $this->apcuPrefix) {\n            apcu_add($this->apcuPrefix.$class, $file);\n        }\n\n        if (false === $file) {\n            // Remember that this class does not exist.\n            $this->missingClasses[$class] = true;\n        }\n\n        return $file;\n    }\n\n    private function findFileWithExtension($class, $ext)\n    {\n        // PSR-4 lookup\n        $logicalPathPsr4 = strtr($class, '\\\\', DIRECTORY_SEPARATOR) . $ext;\n\n        $first = $class[0];\n        if (isset($this->prefixLengthsPsr4[$first])) {\n            $subPath = $class;\n            while (false !== $lastPos = strrpos($subPath, '\\\\')) {\n                $subPath = substr($subPath, 0, $lastPos);\n                $search = $subPath.'\\\\';\n                if (isset($this->prefixDirsPsr4[$search])) {\n                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);\n                    foreach ($this->prefixDirsPsr4[$search] as $dir) {\n                        if (file_exists($file = $dir . $pathEnd)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-4 fallback dirs\n        foreach ($this->fallbackDirsPsr4 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 lookup\n        if (false !== $pos = strrpos($class, '\\\\')) {\n            // namespaced class name\n            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)\n                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);\n        } else {\n            // PEAR-like class name\n            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;\n        }\n\n        if (isset($this->prefixesPsr0[$first])) {\n            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {\n                if (0 === strpos($class, $prefix)) {\n                    foreach ($dirs as $dir) {\n                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                            return $file;\n                        }\n                    }\n                }\n            }\n        }\n\n        // PSR-0 fallback dirs\n        foreach ($this->fallbackDirsPsr0 as $dir) {\n            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {\n                return $file;\n            }\n        }\n\n        // PSR-0 include paths.\n        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {\n            return $file;\n        }\n\n        return false;\n    }\n}\n\n/**\n * Scope isolated include.\n *\n * Prevents access to $this/self from included files.\n */\nfunction includeFile($file)\n{\n    include $file;\n}\n"
  },
  {
    "path": "vendor/composer/LICENSE",
    "content": "\nCopyright (c) Nils Adermann, Jordi Boggiano\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n"
  },
  {
    "path": "vendor/composer/autoload_classmap.php",
    "content": "<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "vendor/composer/autoload_namespaces.php",
    "content": "<?php\n\n// autoload_namespaces.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n);\n"
  },
  {
    "path": "vendor/composer/autoload_psr4.php",
    "content": "<?php\n\n// autoload_psr4.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    'Baijunyao\\\\DesignPatterns\\\\' => array($baseDir . '/'),\n);\n"
  },
  {
    "path": "vendor/composer/autoload_real.php",
    "content": "<?php\n\n// autoload_real.php @generated by Composer\n\nclass ComposerAutoloaderInit88798c90f3cb8871fa59cc0f15b5142f\n{\n    private static $loader;\n\n    public static function loadClassLoader($class)\n    {\n        if ('Composer\\Autoload\\ClassLoader' === $class) {\n            require __DIR__ . '/ClassLoader.php';\n        }\n    }\n\n    public static function getLoader()\n    {\n        if (null !== self::$loader) {\n            return self::$loader;\n        }\n\n        spl_autoload_register(array('ComposerAutoloaderInit88798c90f3cb8871fa59cc0f15b5142f', 'loadClassLoader'), true, true);\n        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader();\n        spl_autoload_unregister(array('ComposerAutoloaderInit88798c90f3cb8871fa59cc0f15b5142f', 'loadClassLoader'));\n\n        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());\n        if ($useStaticLoader) {\n            require_once __DIR__ . '/autoload_static.php';\n\n            call_user_func(\\Composer\\Autoload\\ComposerStaticInit88798c90f3cb8871fa59cc0f15b5142f::getInitializer($loader));\n        } else {\n            $map = require __DIR__ . '/autoload_namespaces.php';\n            foreach ($map as $namespace => $path) {\n                $loader->set($namespace, $path);\n            }\n\n            $map = require __DIR__ . '/autoload_psr4.php';\n            foreach ($map as $namespace => $path) {\n                $loader->setPsr4($namespace, $path);\n            }\n\n            $classMap = require __DIR__ . '/autoload_classmap.php';\n            if ($classMap) {\n                $loader->addClassMap($classMap);\n            }\n        }\n\n        $loader->register(true);\n\n        return $loader;\n    }\n}\n"
  },
  {
    "path": "vendor/composer/autoload_static.php",
    "content": "<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInit88798c90f3cb8871fa59cc0f15b5142f\n{\n    public static $prefixLengthsPsr4 = array (\n        'B' => \n        array (\n            'Baijunyao\\\\DesignPatterns\\\\' => 25,\n        ),\n    );\n\n    public static $prefixDirsPsr4 = array (\n        'Baijunyao\\\\DesignPatterns\\\\' => \n        array (\n            0 => __DIR__ . '/../..' . '/',\n        ),\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->prefixLengthsPsr4 = ComposerStaticInit88798c90f3cb8871fa59cc0f15b5142f::$prefixLengthsPsr4;\n            $loader->prefixDirsPsr4 = ComposerStaticInit88798c90f3cb8871fa59cc0f15b5142f::$prefixDirsPsr4;\n\n        }, null, ClassLoader::class);\n    }\n}\n"
  }
]