/**
* Template_模板方法模式_PHP语言描述
* @author ToniLiu
*/
/**
* 封装进行登录控制所需的数据
*/
class loginModel{
//登录人员ID,通用的,可能是普通用户编号,也可能是后台管理员编号
private $loginId;
//登录的密码
private $pwd;
public function getLoginId(){
return $this->loginId;
}
public function setLoginId($loginId){
$this->loginId = $loginId;
}
public function getPwd(){
return $this->pwd;
}
public function setPwd($pwd){
$this->pwd = $pwd;
}
}
/**
* 定义公共的登陆控制算法模板骨架,即抽象的模板类
*/
abstract class LoginTemplate{
/**
* 判断登陆数据是否正确,也就是是否能登陆成功
* @param lm 封装登陆数据的Model
* @return true 表示登陆成功,false表示登陆失败
*/
public final function Login($lm){
$dbLm = $this->findLoginUser($lm->getLoginId());
if($dbLm!=null){
$encryptPwd = $this->encryptPwd($lm->getPwd());
$lm->setPwd($encryptPwd);
return $this->match($lm,$dbLm);
}
}
/**
* 根据登陆编号来查找和获取存储中相应的数据
* @param loginId 登陆编号
* @return 登陆编号中存储中相对应的数据
*/
public abstract function findLoginUser($loginId);
public function encryptPwd($pwd){
return $pwd;
}
/**
* 判断用户填写的登陆数据和数据空中对应的数据是否匹配的上
* @param lm 用户填写的登陆数据
* @param dbLm 数据库中对应的数据
* @return 表示匹配成功,false表示匹配失败
*/
public function match($lm,$dbLm){
echo "lm:".$lm->getPwd()."
";
echo "dblm:".$dbLm->getPwd()."
";
if($lm->getLoginId() == $dbLm->getLoginId() && $lm->getPwd() == $dbLm->getPwd()){
return true;
}
return false;
}
}
/**
* 实现不同的登陆特例,普通用户登陆逻辑
*/
class NormalLogin extends LoginTemplate{
//此处实现的是特例的个体逻辑
public function findLoginUser($loginId){
//这里是一个示例,就直接返回一个创建好的用户信息了,应该是根据ID去数据库查询是否有这个用户,如果有这个ID用户,初始化并拿出来,普通用户,密码为明码
$lm = new loginModel();
$lm->setLoginId($loginId);
$lm->setPwd("4444");
return $lm;
}
}
/**
* 实现后台工作人员登陆特例
*/
class WorkerLogin extends LoginTemplate{
public function findLoginUser($loginId){
//这里是一个示例,就直接返回一个创建好的用户信息了,模拟从数据拿出来的管理员数据,密码为MD5加密
$lm = new loginModel();
$lm->setLoginId($loginId);
$lm->setPwd(md5("123456"));
return $lm;
}
public function encryptPwd($pwd){
//覆盖父类的方法,提供真正的加密实现
//这里对密码进行加密,比如使用MD5
echo "使用了MD5进行了加密";
return md5($pwd);
}
}
$lm = new loginModel();
$lm->setLoginId("admin");
$lm->setPwd("123456");
//准备用来进行判断的对象
$lt = new WorkerLogin();
$lt2 = new NormalLogin();
//进行登陆测试
$flag = $lt->login($lm);
echo "可以登陆工作平台=".$flag;
$flag2 = $lt2->login($lm);
echo "可以进行普通人员登陆=".(int)$flag2;
?>