PHP与MySQL设计模式:代理模式

  一、数据库连接通用类

  重要的接口:

  接口用来存储MySQL连接数据。实现这个接口的类都可以使用这些数据。

  通过接口可以隔离出程序中一个简单而必要的部分,任何程序都可以实现这个接口。

  接口通过interface来定义,通过implements实现。

<?php
//文件名IConnectInfo.php
interface IConnectInfo
{
    const Host     = "localhost";
    const UserName = "root";
    const Password = "";
    const DBName   = "bergift";

    public function doConnect();
}
?>

  通用MySQL连接类和静态变量:

  接口实现都通过域解析操作符来连接访问值。使用私有静态变量接收,可以使用静态变量处理的速度优势,还可以保证封装性。

  尽量避免使用全局变量,全局变量会破坏封装。静态变量有助于减少类的实例化。

<?php
include_once(‘IConnectInfo.php‘);
class UniversalConnect implements IConnectInfo
{
    private static $Server    = IConnectInfo::Host;
    private static $CurrentDB = IConnectInfo::DBName;
    private static $User      = IConnectInfo::UserName;
    private static $Password  = IConnectInfo::Password;
    private static $HookUp;

    public function doConnect(){
        self::$HookUp = mysqli_connect(self::$Server,self::$User,self::$Password,self::$CurrentDB);

        if(self::$HookUp){

        }elseif(mysqli_connect_error(self::$HookUp)){
            echo "Fail: ".mysqli_connect_error;
        }
        return self::$HookUp;
    }
}
?>

  通过一个类和接口实现简单的连接操作,可大大减少开发的时间,修改很容易,所有信息都存储在常量中。

  代理模式:

  保护代理在验证过请求之后,才会把请求发送到真实主题。这个真实主题就是请求的目标,如访问数据库信息。

  个人理解:用户发送请求,代理模块接收到请求之后,转到验证模块,正确则返回真值,代理模块再导向真正请求的目标。

  通过通用类完成数据库的连接,数据库的选择。

  通用类包括:包含数据库信息的接口、实现数据库连接的类。

  保护代理包括:接口、实现校验的代理模块、实现的客户端对象类。

  流程:登录页面——>Client.php(实现的客户端对象类)——>Proxy.php(代理模块)——>使用通用类连接数据库进行判断,正确则返回代理真值——>代理将页面导向至realProject.php进行处理。

  代理的作用是确保有权限的用户才能访问网站。

  可以把代理模式中代理参与者看做是一个场所,在用户访问真实主题前可以在这里做一些真正确保高安全性的操作。

  代理模块是一个简单的口令检查,可以调用一个高安全性模块来处理敏感信息。

  接口文件

<?php
//文件名ISubject.php
Interface ISubject
{
    function request();
}
?>

  代理类

<?php
//文件名Proxy.php
include_once(‘ISubject.php‘);
include_once(‘RealSubject.php‘);
include_once(‘UniversalConnect.php‘);

class Proxy implements ISubject
{
    private $TableMaster;
    private $HookUp;
    private $LoginSuccess;
    private $RealSubject;

    public function login($UserNow,$PassNow)
    {
        $UserName = $UserNow;
        $PassWord = md5($PassNow);
        $this->LoginSuccess = false;
        $this->TableMaster  = "BAdmin";
        $this->HookUp        = UniversalConnect::doConnect();

        $sql = "SELECT password from $this->TableMaster WHERE username = ‘$UserName‘";
        if($result = $this->HookUp->query($sql))
        {
            $row = $result->fetch_array(MYSQLI_ASSOC);
            if($row[‘password‘]==$PassWord)
            {
                $this->LoginSuccess = true;
            }
            $result->close();
        }
        elseif(($result = $this->HookUp->query($sql))===false)
        {
            echo "Failed".$this->HookUp->error;
            exit();
        }
        $this->HookUp->close();
        if($this->LoginSuccess)
        {
            $this->request();
        }
        else
        {
            header("Location:index.php");
        }
    }
    public function register($UserNow,$PassNow)
    {
        $UserName = $UserNow;
        $PassWord = md5($PassNow);
        $this->LoginSuccess = false;
        $this->TableMaster  = "BAdmin";
        $this->HookUp        = UniversalConnect::doConnect();

        $sql = "INSERT INTO $this->TableMaster VALUES(‘$UserName‘,‘$PassWord‘)";
        if($result = $this->HookUp->query($sql))
        {
            $this->LoginSuccess = true;
        }
        elseif(($result = $this->HookUp->query($sql))===false)
        {
            echo "Failed".$this->HookUp->error;
            exit();
            //header("Location:index.php");
        }
        $this->HookUp->close();
        if($this->LoginSuccess)
        {
            echo "<script>alert(‘Success!‘);</script>";
        }
        else
        {
            header("Location:index.php");
        }
    }
    public function request()
    {
        $this->realSubject = new RealSubject();
        $this->realSubject->request();
    }
}
?>

  接收客户端发送的信息的Client类,发送消息到代理类进行验证。

<?php
//文件名Client.php
include_once(‘Proxy.php‘);
class Client
{
    private $Proxy;
    private $UserName;
    private $PassWord;

    public function __construct()
    {
        $this->TableMaster = ‘BAdmin‘;
        $this->HookUp      = UniversalConnect::doConnect();
        $this->UserName    = $this->HookUp->real_escape_string(trim($_POST[‘username‘]));
        $this->PassWord    = $this->HookUp->real_escape_string(trim($_POST[‘password‘]));
        if($_GET[‘do‘]===‘register‘)
        {
            $this->getRegis($this->proxy=new Proxy());
        }elseif($_GET[‘do‘]===‘login‘)
        {
            $this->getIface($this->proxy=new Proxy());
        }
    }
    private function getIface(ISubject $proxy)
    {
        $proxy->login($this->UserName,$this->PassWord);
    }
    private function getRegis(ISubject $proxy)
    {
        $proxy->register($this->UserName,$this->PassWord);
    }
}
$Worker = new Client();
?>

  真实主题,只能由代理类进入。

<?php
//文件名RealSubject.php
include_once(‘ISubject.php‘);
class RealSubject implements ISubject
{
    public function request()
    {
        session_save_path(dirname(__FILE__).‘/sess/‘);
        @session_start();
        $_SESSION[‘bergift‘] = ‘admin‘;
        header("Location:main.php");
    }
}
?>
时间: 2024-11-05 16:00:20

PHP与MySQL设计模式:代理模式的相关文章

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式——代理模式

概念 代理模式(Proxy),为其他对象提供一种代理以控制对象的访问. 模式结构 一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再 访问真正要访问的对象. 代理模式UML图 代码实战 <span style="font-family:KaiTi_GB2312;font-size:18px;"> //代理模式 class  Proxy : IGiveGift                   //让"代理&qu

23种设计模式----------代理模式(二)

(上一篇)23种设计模式----------代理模式(一) 之前说了基本的代理模式和普通代理模式.接下来开始看下强制代理模式和虚拟代理模式 三,强制代理模式: 一般的代理模式都是通过代理类找到被代理的对象,从而调用被代理类中的方法(即完成被代理类中的任务). 而,强制代理模式则是先找到被代理类自己去完成事情,然后被代理类又将该做的事情转交到代理类中,让代理类来完成. 假如:你有事求助于某位名人. 你告诉名人说有事想请他帮忙,然后他说最近一段时间比较忙,要不你找我的经纪人来办吧. (本来找名人办事

23种设计模式----------代理模式(三) 之 动态代理模式

(上一篇)种设计模式----------代理模式(二) 当然代理模式中,用的最广泛的,用的最多的是  动态代理模式. 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理. 抽象接口的类图如下: --图来自设计模式之禅 所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类.其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理. 代码实现如下 抽象主题类或者接口: 1 package com.ye

23种设计模式----------代理模式(一)

代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者接口) IGamePlayer 2,代理类. 3,被代理类. 下面以游戏玩家代理为例. 一,先来看下最基本的代理模式. 代码如下: 主题接口: 1 package com.yemaozi.proxy.base; 2 3 //游戏玩家主题接口 4 public interface IGamePlaye

5.大话设计模式-代理模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel { public class Proxy:IAction { ZQZ zzz = null; public Proxy(ZQZ mm) { zzz = mm; } public void SendFlower() { zzz

设计模式----代理模式(Proxy)

为还有一个对象提供一个替身或占位符以控制对这个对象的訪问. 代理模式的组成: 主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理取代. 真正主题(RealSubject):真正处理请求的类. 代理(Proxy):真正主题的代理类,请求方通过调用代理对象间接调用真正主题. 代理模式的简单样例: (主题接口类)Subject.java package xu.neng.Proxy; public interface Subject { public void re

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

设计模式-代理模式(Go语言描述)

大家好, 我是大帅哥,由于最近又变帅了, 所以我决定由我的代理人小帅哥来写这篇博客,不过内容可以放心,还是由我来完成,小帅哥的活就是将我的内容替我发出来罢了. &_& 还是进入正题吧, 今天这篇博客我们继续来学习设计模式, 在学习了上面几个设计模式之后大家有没有发现设计模式其实很简单, 难道地方是何时选用合适的模式, 这也是设计模式最重要的地方, 不能我们学会的设计模式就可以乱用. 明白就好-- 下面我们就开始介绍一个新的设计模式-代理模式. 模式定义 什么是代码模式? 其实文章刚开始的段

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理