PHP设计模式之简单投诉页面实例


Posted in PHP onFebruary 24, 2016

本文实例介绍了PHP简单投诉页面的实现代码,分享给大家供大家参考,具体内容如下

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");

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>

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP 身份证号验证函数
May 07 PHP
PHP 翻页 实例代码
Aug 07 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php 文件上传系统手记
Oct 26 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
php文件上传、下载和删除示例
Aug 28 PHP
如何直接访问php实例对象中的private属性详解
Oct 12 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
PHP根据key删除数组中指定的元素
Feb 28 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
YII2框架使用控制台命令的方法分析
Mar 18 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 #PHP
phalcon框架使用指南
Feb 23 #PHP
PHP计算日期相差天数实例分析
Feb 23 #PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 #PHP
PHP编写RESTful接口
Feb 23 #PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 #PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 #PHP
You might like
PHP之生成GIF动画的实现方法
2013/06/07 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python中的print()输出
2019/04/12 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
助人为乐表扬信范文
2014/01/14 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
教师教学评估方案
2014/05/09 职场文书
七夕活动策划方案
2014/08/16 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技