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

<?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>

PHP设计模式练习——制作简单的投诉页面的更多相关文章

  1. phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

    制作简单的acl, dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等) ...

  2. canvas制作简单动画

    在画布元素<canvas>中,除了绘制图形.图像.文字外,还可以制作一些简单的动画,制作过程十分简单,主要分为两步操作: 1.自定义一个函数,用于图形的移动或其他动作. 2.使用setIn ...

  3. JSP制作简单登陆

    JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文 ...

  4. Android笔记-4-实现登陆页面并跳转和简单的注册页面

    实现登陆页面并跳转和简单的注册页面   首先我们来看看布局的xml代码 login.xml <span style="font-family:Arial;font-size:18px; ...

  5. 对于使用javaweb技术制作简单管理系统的学习

    近期在老师的引导下我们学习了利用Javaweb技术制作简单的管理系统,其中涉及到的技术很多,由于大多都是自学 对这些技术的理解还太浅显但能实现一些相关功能的雏形. (一).登录功能 在登陆功能中通过与 ...

  6. Highcharts使用教程(1):制作简单图表

    今天我们要使用JavaScript图表Highcharts制作简单的柱形图,我们已经安装好Highcharts,让我们开始制作图表吧. 步骤一 在网页中添加一个div.设置id,设置图表长.高.代码如 ...

  7. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  8. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  9. FineUI小技巧(1)简单的购物车页面

    起因 最初是一位 FineUI 网友对购物车功能的需求,需要根据产品单价和数量来计算所有选中商品的总价. 这个逻辑最好在前台使用JavaScript实现,如果把这个逻辑移动到后台C#实现,则会导致过多 ...

随机推荐

  1. Javascript各种事件汇总

    https://www.cnblogs.com/diligenceday/p/4190173.html#undefined https://www.cnblogs.com/starof/p/40663 ...

  2. Python3 PIL Image 操作文件后导致占用问题

    需求:按图片分辨率范围分类图片(每个商品有N张图片在一个目录内). 实现:用PIL Image打开图片并读取宽度和高度.然后按不同分辨率存档到不同目录. 问题:从原有目录移动到目标目录时出现 “Per ...

  3. Django orm查询操作

    基于双下划线查询切记!!!!正向查询按字段,反向查询按表名的小写 正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询 反向:在Book表里设置关联Obj表,Obj-- ...

  4. JavaScript操作符(=?,)优先级

    JavaScript操作符优先级: 关于最后3个运算符的优先级比较,下面通过一个实例来具体说明: var a,b,c; a = 3,4,5; b = a--,--a,a; c = a ? b++ : ...

  5. Junit使用过程中需要注意的诡异bug以及处理办法

    在开发过程中我们有时会遇到狠多的问题和bug,对于在编译和运行过程中出现的问题很好解决,因为可以在错误日志中得到一定的错误提示信息,从而可以找到一些对应的解决办法.但是有时也会遇到一些比较诡异的问题和 ...

  6. 网页URLs

    Extending Python Interpretor: https://docs.python.org/3/extending/index.html Aliyun Mriirors: https: ...

  7. HDU 1281——棋盘游戏——————【最大匹配、枚举删点、邻接表方式】

     棋盘游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. Unity C# 用枚举(enum)制作复选框

    最近在项目中做测试脚本用到一些布尔值做方法的开关,突然想到可以制作一个复选框控制开关. 首先搜集网上的资料,基本大同小异,这里就不多做解释了,代码附上: public class EnumFlagsA ...

  9. iOS-swift-枚举和结构体

    1.枚举 使用关键字 enum 创 建枚举. 枚举默认起始值为 0,可以自定义起始值. 在枚举中可以定义方法,和类中定义的一样. 使用关键字 rawValue 访问当前枚举的值. enum Rank: ...

  10. MySQL的btree索引和hash索引

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...