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

<?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. 转 python 随机走动的模拟

    https://blog.csdn.net/python2014/article/details/21231971 麻省理工的随机走动模块,还不错,三天搞懂了,不过懂得不彻底.   记录下修改的代码 ...

  2. edis Cluster实现原理

    一.Redis Cluster主要特性和设计     集群目标 1)高性能和线性扩展,最大可以支撑到1000个节点:Cluster架构中无Proxy层,Master与slave之间使用异步replic ...

  3. getopt 学习

    https://www.cnblogs.com/qingergege/p/5914218.html

  4. Mybatis学习笔记11 - 动态sql之trim标签

    trim标签体中是整个字符串拼串后的结果.prefix="" 前缀: prefix给拼串后的整个字符串加一个前缀prefixOverrides="" 前缀覆盖: ...

  5. Django-2 路由层

    U RL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 2.1 简单的路由配置 from django.urls import p ...

  6. Broken Keyboard (a.k.a. Beiju Text) UVA - 11988 (链表)

    题目链接:https://vjudge.net/problem/UVA-11988 题目大意:输入一个字符串,输出在原本应该是怎么样的?  具体方法是 碰到' [ ' 回到最前面  碰到‘ ]’  回 ...

  7. git使用笔记-比较分支差异

    比如我们有 2 个分支:master, dev,现在想查看这两个 branch 的区别,有以下几种方式: 1.查看 dev 有,而 master 中没有的: git log dev ^master 同 ...

  8. java语言编程实现两个时间相差多少天、多少小时、多少分、多少秒

    不多说,直接上干货! DateDistance.java package zhouls.bigdata.DataFeatureSelection.test; import java.text.Date ...

  9. Windows下Redis数据库管理工具(redis-desktop-manager)安装与配置(图文详解)

    Redis Desktop Manager安装 Redis Desktop Manager直接下载安装就行非常简单.下载地址: 官网下载:https://redisdesktop.com/downlo ...

  10. rake 任务参数传递问题解决

    原文 :  https://robots.thoughtbot.com/how-to-use-arguments-in-a-rake-task namespace :tweets do desc 'S ...