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采集相关教程之一 CURL函数库
Feb 15 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
PHP分页类集锦
Nov 18 PHP
php将金额数字转化为中文大写
Jul 09 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
smarty模板数学运算示例
Dec 11 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
Oct 21 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 连接mssql数据库 初学php笔记
2010/03/01 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
Js切换功能的简单方法
2010/11/23 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
仓库管理员岗位职责
2014/03/19 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
毕业典礼邀请函
2015/01/31 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python