• PHP设计模式练习——制作简单的投诉页面


    ---恢复内容开始---

    <?php
    
    /*
     *  设计模式练习
     *  1.数据库连接类(单例模式)
     *  2.调用接口实现留言本功能(工厂模式)
     *  3.实现分级举报处理功能(责任链模式)
     *  4.发送不同组合的举报信息(桥接模式)
     *  5.发送不同格式的举报信息(适配器模式)
     *  6.在投诉内容后自动追加时间(装饰器模式)
     *  7.根据会员登录信息变换显示风格(观察者模式)
     *  8.根据发帖长度加经验值(策略模式)
     */
    
    interface DB {
    
        function conn();
    }
    
    /**
     * 单例模式
     */
    class MysqlSingle implements DB {
    
        protected static $_instance = NULL;
    
        public static function getInstance() {
            if (!self::$_instance instanceof self) {
                self::$_instance = new self;
            }
            return self::$_instance;
        }
    
        final protected function __construct() {
            echo 'Mysql单例创建成功<br>';
        }
    
        final protected function __clone() {
            return false;
        }
    
        public function conn() {
            echo 'Mysql连接成功<br>';
        }
    
    }
    
    /**
     * 工厂模式
     */
    interface Factory {
    
        function createDB();
    }
    
    class MysqlFactory implements Factory {
    
        public function createDB() {
            echo 'Mysql工厂创建成功<br>';
            return MysqlSingle::getInstance();
        }
    
    }
    
    /**
     * 根据用户名显示不同风格
     * 观察者模式
     */
    class Observer implements SplSubject {
    
        protected $_observers = NULL;
        public $_style = NULL;
    
        public function __construct($style) {
            $this->_style = $style;
            $this->_observers = new SplObjectStorage();
        }
    
        public function show() {
            $this->notify();
        }
    
        public function attach(SplObserver $observer) {
            $this->_observers->attach($observer);
        }
    
        public function detach(SplObserver $observer) {
            $this->_observers->detach($observer);
        }
    
        public function notify() {
            $this->_observers->rewind();
            while ($this->_observers->valid()) {
                $observer = $this->_observers->current();
                $observer->update($this);
                $this->_observers->next();
            }
        }
    
    }
    
    class StyleA implements SplObserver {
    
        public function update(SplSubject $subject) {
            echo $subject->_style . ' 模块A<br>';
        }
    
    }
    
    class StyleB implements SplObserver {
    
        public function update(SplSubject $subject) {
            echo $subject->_style . ' 模块B<br>';
        }
    
    }
    
    /**
     * 根据不同方式进行投诉
     * 桥接模式
     */
    class Bridge {
    
        protected $_obj = NULL;
    
        public function __construct($obj) {
            $this->_obj = $obj;
        }
    
        public function msg($type) {
            
        }
    
        public function show() {
            $this->msg();
            $this->_obj->msg();
        }
    
    }
    
    class BridgeEmail extends Bridge {
    
        public function msg() {
            echo 'Email>>';
        }
    
    }
    
    class BridgeSms extends Bridge {
    
        public function msg() {
            echo 'Sms>>';
        }
    
    }
    
    class Normal {
    
        public function msg() {
            echo 'Normal<br>';
        }
    
    }
    
    class Danger {
    
        public function msg() {
            echo 'Danger<br>';
        }
    
    }
    
    /**
     * 适配器模式
     */
    class Serialize {
    
        public $content = NULL;
    
        public function __construct($content) {
            $this->content = serialize($content);
        }
    
        public function show() {
            return '序列化格式:<br>' . $this->content;
        }
    
    }
    
    class JsonAdapter extends Serialize {
    
        public function __construct($content) {
            parent::__construct($content);
            $tmp = unserialize($this->content);
            $this->content = json_encode($tmp, TRUE);
        }
    
        public function show() {
            return 'Json格式:<br>' . $this->content;
        }
    
    }
    
    /**
     * 在投诉内容后自动追加
     * 装饰器模式
     */
    class Base {
    
        protected $_content = NULL;
    
        public function __construct($content) {
            $this->_content = $content;
        }
    
        public function getContent() {
            return $this->_content;
        }
    
    }
    
    class Decorator {
    
        private $_base = NULL;
    
        public function __construct(Base $base) {
            $this->_base = $base;
        }
    
        public function show() {
            return $this->_base->getContent() . '>>系统时间:' . date('Y-m-d H:i:s', time());
        }
    
    }
    
    /**
     * 分级举报处理功能
     * 责任链模式
     */
    class level1 {
    
        protected $_level = 1;
        protected $_top = 'Level2';
    
        public function deal($level) {
            if ($level <= $this->_level) {
                echo '处理级别:1<br>';
                return;
            }
            $top = new $this->_top;
            $top->deal($level);
        }
    
    }
    
    class level2 {
    
        protected $_level = 2;
        protected $_top = 'Level3';
    
        public function deal($level) {
            if ($level <= $this->_level) {
                echo '处理级别:2<br>';
                return;
            }
            $top = new $this->_top;
            $top->deal($level);
        }
    
    }
    
    class level3 {
    
        protected $_level = 3;
        protected $_top = 'Level2';
    
        public function deal($level) {
            echo '处理级别:3<br>';
            return;
        }
    
    }
    
    if (!empty($_POST)) {
        echo '<h1>PHP设计模式</h1>';
        //连接数据库——工厂+单例模式
        $mysqlFactory = new MysqlFactory();
        $single = $mysqlFactory->createDB();
        $single->conn();
        echo '<br>';
        //观察者模式
        $username = $_POST['username'];
        $ob = new Observer($username);
        $a = new StyleA();
        $ob->attach($a);
        $b = new StyleB();
        $ob->attach($b);
        $ob->show();
        echo '<br>';
        $ob->detach($b);
        $ob->show();
        echo '<br>';
        //桥接模式
        $typeM = $_POST['typeM'];
        $typeN = 'Bridge' . $_POST['typeN'];
        $obj = new $typeN(new $typeM);
        $obj->show();
        echo '<br>';
        //适配器模式
        $post = $_POST;
        $obj = new Serialize($post);
        echo $obj->show();
        echo '<br>';
        $json = new JsonAdapter($post);
        echo $json->show();
        echo '<br>';
        echo '<br>';
        //装饰器模式
        $content = $_POST['content'];
        $decorator = new Decorator(new Base($content));
        echo $decorator->show();
        echo '<br>';
        //责任链模式
        echo '<br>';
        $level = $_POST['level'];
        $deal = new Level1();
        $deal->deal(intval($level));
        return;
    }
    require("0.html");
    <!DOCTYPE html>
    <!--
    To change this license header, choose License Headers in Project Properties.
    To change this template file, choose Tools | Templates
    and open the template in the editor.
    -->
    <html>
        <head>
            <title>PHP设计模式</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <style>
                div{border:solid gray 1px;margin-top:10px;height: 100px;width: 200px;}
            </style>
        </head>
        <body>
            <form action="0.php" method="post">
                <h1>用户名</h1>
                <select id="username" name="username">
                    <option value="Tom">Tom</option>
                    <option value="Lily">Lily</option>
                </select>
                <h1>投诉方式</h1>
                <select id="type" name="typeM">
                    <option value="Normal">Normal</option>
                    <option value="Danger">Danger</option>
                </select>
                <select id="type" name="typeN">
                    <option value="Email">Email</option>
                    <option value="Sms">Sms</option>
                </select>
                <h1>处理级别</h1>
                <select id="level" name="level">
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                </select>
                <h1>投诉内容</h1>
                <textarea id="content" name="content" rows="3"></textarea>
                <button type="submit">提交</button>
            </form>
        </body>
    </html>
  • 相关阅读:
    JDBC(解析properties)
    测试字符串
    TestNG基本使用
    细化到知识点的python练习题、笔试题(都说python简单,快来测试一下吧)
    java操作excel(通过POI)
    I/O密集型任务下,单线程、多进程、多线程、协程
    HttpClient的使用(get、post请求)
    磁盘不分区,直接格式化后挂载
    添加 K8S CPU limit 会降低服务性能
    Minio设置永久下载链接
  • 原文地址:https://www.cnblogs.com/tlxma/p/5210641.html
Copyright © 2020-2023  润新知