PHP设计形式之观看者形式定义与用法示例,PHP设

作者: 韦德国际1946手机版  发布:2019-06-25

本文实例讲述了PHP设计形式之观看者情势定义与用法。分享给我们供我们参照他事他说加以调查,具体如下:

正文实例讲述了PHP设计格局之委托形式定义与用法。分享给大家供大家参照他事他说加以考察,具体如下:

本文实例讲述了PHP设计情势之工厂格局定义与用法。分享给大家供我们仿效,具体如下:

正文实例讲述了PHP设计形式之适配器形式定义与用法。分享给大家供大家参照他事他说加以考察,具体如下:

<?php
/**
 * Interface Observable
 * define a observable interface
 * @author jichao.wang
 */
interface Observable
{
  function attach(Observer $observer);
  function detach(Observer $observer);
  function notify();
}
/**
 * Class Login
 * @author jichao.wang
 */
class Login implements Observable
{
  private $observers;
  public $status;
  public $ip;
  const LOGIN_ACCESS = 1;
  const LOGIN_WRONG_PASS = 2;
  const LOGIN_USER_UNKNOWN = 3;
  function __construct()
  {
    $this->observers = array();
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * attach a observer
   */
  function attach(Observer $observer)
  {
    $this->observers[] = $observer;
  }
  /**
   * @param Observer $observer
   * @author jichao.wang
   * detach a observer
   */
  function detach(Observer $observer)
  {
    $newObservers = array();
    foreach ($this->observers as $key => $obs) {
      if ($obs !== $observer) {
        $newObservers[] = $obs;
      }
    }
    $this->observers = $newObservers;
  }
  /**
   * @author jichao.wang
   * handle observer notify
   */
  function notify()
  {
    foreach ($this->observers as $obs) {
      $obs->update($this);
    }
  }
  /**
   * @author jichao.wang
   * 执行登陆
   */
  function handleLogin()
  {
    $ip = rand(1,100);
    switch (rand(1, 3)) {
      case 1:
        $this->setStatus(self::LOGIN_ACCESS, $ip);
        $ret = true;
        break;
      case 2:
        $this->setStatus(self::LOGIN_WRONG_PASS, $ip);
        $ret = false;
        break;
      case 3:
        $this->setStatus(self::LOGIN_USER_UNKNOWN, $ip);
        $ret = false;
        break;
    }
    /**
     * handle event
     */
    $this->notify();
    return $ret;
  }
  /**
   * @param $status
   * @author jichao.wang
   * set login status
   */
  function setStatus($status,$ip)
  {
    $this->status = $status;
    $this->ip = $ip;
  }
  /**
   * @return mixed
   * @author jichao.wang
   * get login status
   */
  function getStatus()
  {
    return $this->status;
  }
}
/**
 * Interface Observer
 * @author jichao.wang
 */
interface Observer {
  function update(Observable $observable);
}
/**
 * Class EmailObserver
 * @author jichao.wang
 */
class EmailObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
/**
 * Class PhoneObserver
 * @author jichao.wang
 */
class PhoneObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
class AbcObserver implements Observer {
  function update (Observable $observable) {
    $status = $observable->getStatus();
    if($status == Login::LOGIN_ACCESS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆成功!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆成功!'.'------------------';
    }
    if($status == Login::LOGIN_WRONG_PASS){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,密码错误!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,密码错误!'.'------------------';
    }
    if($status == Login::LOGIN_USER_UNKNOWN){
//      $this->sendMail('用户ip:'.$observable->ip.'登陆失败,无此用户!');
      echo __CLASS__.'用户ip:'.$observable->ip.'登陆失败,无此用户!'.'------------------';
    }
  }
}
//实例化登陆信息
$login = new Login();
//实现发邮件观察者
$login->attach(new EmailObserver());
//实现发验证码观察者
$login->attach(new PhoneObserver());
//实现其他观察者
$login->attach(new AbcObserver());
//开始登陆
$login->handleLogin();
?>

寄托方式:

厂子格局(Factory Design Pattern)作为一种创造型设计格局, 服从了开放-封闭原则, 对修改封闭, 对扩充开放. 工厂方法(Factory Method)格局正是要开创"某种东西". 对于工厂方法方式, 要创设的"东西"是四个成品,那几个产品与创制它的类之间不设有绑定.实际上,为了保证这种松耦合,客户会通过一个工厂爆发央求. 再由工厂创立所供给的产品.也足以换种办法思考, 利用工厂方法格局, 乞求者只发出须求, 而不具体创立产品.

适配器很轻易通晓, 大许多人家庭都有手提式有线电话机转接器, 用来为移动电话充电,那正是一种适配器. 假若唯有USB接头, 就不大概将移动电话插到标准插座上. 实际上, 必须接纳三个适配器, 一端接USB插头, 一端接插座. 当然, 你能够拿出电气工具,改装USB连接头, 或许重新安装插座, 可是这么会拉动繁多附加的干活, 而且可能会把连接头或插座弄坏. 所以, 最可取的艺术正是找一个适配器. 软件开采也是如此.

运维结果:

由此分配或委托至其余对象,委托设计情势能够去除大旨指标中的判决和复杂的效能性。

厂子的干活

类适配器形式(使用持续)

EmailObserver用户ip:41登入战败,无此用户!------------------PhoneObserver用户ip:41登录失利,无此用户!------------------AbcObserver用户ip:41登录败北,无此用户!------------------

class Bank{
  protected $info;
  /*
  设置基本信息
  @param string $type 类型。例如"RMB"
  @param int $money 利率。例如"0.4%"
  */
  public function updateBrankInfo($type,$money){
    $this->info[$type]=$money;
  }
  /*
  相关操作(包括存款、取款操作)
  @param int $branktype 操作类型
  */
  public function brankWithdraw($branktype){
    $obj=new $branktype;
    return $obj->brankMain($this->info);
  }
}
/*
委托接口
*/
interface Delegate{
  /*
  操作方法:
  实现该接口必须实现的方法
  */
  public function brankMain($info);
}
/*
存款操作类
*/
class brankDeposit implements Delegate{
  /*
  存款操作
  */
  public function brankMain($info){
    echo $info['deposit'];
  }
} 
/*
取款操作类
*/
class brankWithdraw implements Delegate{
  /*
  取款操作
  */
  public function brankMain($info){
    echo $info['withdraw'];
  }
}
/*
客户端测试代码:
*/
$bank=new Bank();
$bank->updateBrankInfo("deposit","4000");
$bank->updateBrankInfo("withdraw","2000");
$bank->brankWithdraw("brankDeposit");
echo "<br>";
$bank->brankWithdraw("brankWithdraw");

先创设多少个工厂的接口

类适配器形式很简短, 但是与对象适配器方式比较, 类适配器方式的灵活性弱些, 类适配器轻巧的原由在于 , 适配器(Adapter)会从被适配者(Adaptee)承继作用, 所以适配格局中需求编写制定的代码相比较少.

越来越多关于PHP相关内容感兴趣的读者可查阅本站专项论题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP设计形式之观看者形式定义与用法示例,PHP设计方式之适配器方式定义与用法详解。PHP基本语法入门教程》、《PHP运算与运算符用法计算》、《php字符串(string)用法总计》、《php mysql数据库操作入门教程》及《php常见数据库操作技术汇总》

运营结果:

Factory.php

是因为类适配器情势涵盖重复承继, 可是PHP并不帮衬再一次承袭, 不过幸运的是,PHP能够用接口来效仿双重承接, 上面是三个没有错的组织, 不止承继了四个类, 同期还持续了叁个接口

仰望本文所述对我们PHP程序设计有所协理。

4000
2000

<?php
abstract class Factory
{
 //抽象的创建对象的方法
 protected abstract function createProduct();
 //该方法调用createProduct方法返回一个产品对象.
 public function start()
 {
   return $this->createProduct();
 }
}
class ChildClass extends ParentClass implements ISomeAdapter
{
}

你大概感兴趣的文章:

  • php设计形式Delegation(委托形式)
  • php设计方式之委托形式
  • PHP设计情势之建造者方式定义与用法轻易示例
  • PHP设计方式之装饰器形式定义与用法轻巧示例
  • PHP耦合设计情势实例分析
  • PHP设计情势之适配器情势原理与用法解析
  • PHP设计形式之原型设计格局原理与用法深入分析
  • PHP设计形式之单例情势原理与完毕情势剖析
  • PHP常用的二种设计方式汇总
  • PHP设计方式之委托格局定义与用法轻便示例

守旧情势:

start主意再次来到二个产品,该办法调用createProduct方式成功发生产品的操作.所以createProduct的现实性完毕要创设并赶回贰个按Product接口实现的出品对象.

福寿无疆类适配器格局时, 参加者务必总结叁个PHP接口

在守旧方法下,大家必要剖断当前操作是取款操作依旧积蓄操作,在分别调用Bank类中的取款操作和积储操作。

比如产品皆有一个一同的措施getProperties(), 以下是对应Product接口

上边以二个货币兑换为例来演示:

寄托格局:

Product.php

假若有三个商城网址在同期出卖软件服务和软件出品, 前段时间, 全体交易都在美利坚合众国拓展, 所以完全能够用港币来成功具有总结.未来开垦人士希望能有贰个转变器能管理法郎和法郎的兑换, 而不转移原本按欧元交易额的类.通过扩张一个适配器, 未来先后就可以以用卢比计算也足以用英镑总括.

在委托情势下,大家将没有必要客户端的决断操作,对客户端的话,须求什么样操作,直接传入操作类型就可以,Bank类可机关判定操作类型,再次来到相应操作的操作结果。当大家的操作类型相当多的时候,在客户端用if else决断无疑是很吓人的,再假诺大家在广大地点都要有那块决断代码,大家必要对那一个地点的剖断代码都进行改变(到场后来增加的判别),而使用委托方式,大家只有须要在新加上的地点增多相应必要的品种就可以,无需改动其余地方的客户端代码(十分大程度上压实了代码的复用性)。

<?php
//产品接口
interface Product
{
 public function getProperties();
}

DollarCalc.php

随之, 大家要手无寸铁八个工厂,文本工厂TextFactory和图像工厂phptoFactory

<?php
class DollarCalc
{
 private $dollar;
 private $product;
 private $service;
 public $rate = 1;
 public function requestCalc($productNow, $serviceNow)
 {
  $this->product = $productNow;
  $this->service = $serviceNow;
  $this->dollar = $this->product   $this->service;
  return $this->requestTotal();
 }
 public function requestTotal()
 {
  $this->dollar *= $this->rate;
  return $this->dollar;
 }
}

TextFactory.php

翻开这一个类,能够看看个中有多天品质$rate,requestTotal()方法运用$rate总结二次交易的金额.在这一个版本中, 这么些值设置为1,实际上海市总金额不供给再乖以兑换率, 可是若是要为客户提供折扣大概要追加额外服务或制品的附加费, $rate变量会很方便. 那些类并不是适合器情势的一有的, 然则那是二个源点.

<?php
include_once('Factory.php');
include_once('TextProduct.php');
class TextFactory extends Factory
{
 protected function createProduct()
 {
  $product = new TextProduct();
  return $product->getProperties();
 }
}

需求调换了

PhotoFactory.php

明日客户的店肆要向澳大华雷斯联邦(Commonwealth of Australia)进步,所以要求支出三个行使, 可以用比索完毕同样的总计. 你指望以此美元总结能够像DollarCalc同样, 所要做的正是退换变量名.

<?php
include_once('Factory.php');
include_once('PhotoProduct.php');
class PhotoFactory extends Factory
{
 protected function createProduct()
 {
  $product = new PhotoProduct();
  return $product->getProperties();
 }
}

EuroCalc.php

能够见见,在工厂方法的兑现中, getProperties方法引进了多态(polymorphism), 将用那几个办法重返"文本"或"图像". 同一个getProperties()有两个(poly)差异的模样(morphs), 那就是多态.在这种情状下, 个中一种样式重临文本, 而另一种回到图像.

<?php
class EuroCalc
{
 private $euro;
 private $product;
 private $service;
 public $rate = 1;
 public function requestCalc($productNow, $serviceNow)
 {
  $this->product = $productNow;
  $this->service = $serviceNow;
  $this->euro = $this->product   $this->service;
  return $this->requestTotal();
 }
 public function requestTotal()
 {
  $this->euro *= $this->rate;
  return $this->euro;
 }
}

能够在properties那些实现中放入你想要的任王孝文西,工厂方法设计将会创设这几个指标, 并把她归来给Client使用.

接下去, 再把利用的其他部分插入到EuroCalc类中. 可是,因为客户的具备数据都以按法郎计算的.换句话说, 假如不另行开拓总体程序, 就无法在系统中"插入"那么些美元总括. 可是你不想这么做. 为了加入EuroCalc, 你必要多个适配器: 就像是找一个适配器来适应澳大热那亚(Australia)的插座同样, 可以创设二个适配器, 让你的系统能够运用台币. 幸运的是, 类适配器正是为如此的场合设计的.首先须要成立二个接口. 在那一个类图中, 这一个接口名字为ITarget. 它唯有贰个办法requester(). requester()是一个架空方法, 要由接口的切切实实贯彻来贯彻这些方法.

本文由韦德国际1946发布于韦德国际1946手机版,转载请注明出处:PHP设计形式之观看者形式定义与用法示例,PHP设

关键词: 韦德国际bv1946

上一篇:Windows下搭建PHP开荒条件,开荒条件搭建
下一篇:没有了