欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入分析PHP设计模式

程序员文章站 2022-03-07 19:04:25
1、单例模式一个类,只能允许有一个对象存在

1、单例模式

一个类,只能允许有一个对象存在

<?php
class test{
  protected function __construct(){
  }

  public static function getinstance(){
    $_test = new test();
    return $_test;
  }
}
$test = test::getinstance();
var_dump($test);
?>

2、工厂模式

工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。

把对象的创建和使用的过程分开,比如: classa 调用 classb,那么 classa 只调用classb 的方法,
至于实例化 classb 则在工厂内实现。这样既减少了代码的重复使用,也方便对 classb 的后期维护。
如果 classb 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 classb 的方法即可,减少错误

interface mysql{ 
  public function connect();
}
 
class mysqli2 implements mysql{
  public function connect(){
    echo 'mysqli';
  }
}
 
class pdo2 implements mysql{
  public function connect(){
    echo 'pdo';
  }
}

class mysqlfactory{
  static public function factory($class_name){
    return new $class_name();
  }
}
$obj = mysqlfactory::factory('pdo2');
$obj->connect();

3、注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,

在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

<?php
class register
{
    protected static $objects;
    function set($alias,$object)//将对象注册到全局的树上
    {
      self::$objects[$alias]=$object;//将对象放到树上
    }
    static function get($name){
      return self::$objects[$name];//获取某个注册到树上的对象
     }
  function _unset($alias)
  {
     unset(self::$objects[$alias]);//移除某个注册到树上的对象。
    }
}

\auto\register::set('single',$single);
$single = \auto\register::get('single');
var_dump($single);

4、适配器模式

将一个类的接口转换成客户希望的另外一个接口。

//目标角色
interface aims
{
  public function newmethod1();
  public function newmethod2();
}
 
//需要被适配的类(adaptee)
class man
{
  public function oldmethod1()
  {
    echo 'man';
  }
 
  public function oldmethod2()
  {
    echo '男人';
  }
}
 
//需要被适配的类(adaptee)
class woman
{
  public function oldmethod1()
  {
    echo 'woman';
  }
 
  public function oldmethod2()
  {
    echo '女人';
  }
}
 
//适配器,
class adapters implements aims
{
  private $adaptee;
  public function __construct($adaptee)
  {
    $this->adaptee = $adaptee;
  }
 
  public function newmethod1()
  {
    //以少量的代码对被适配者作出适配
    echo 'sex :';
    $this->adaptee->oldmethod1();
  }
 
  public function newmethod2()
  {
    echo 'sex name :';
    $this->adaptee->oldmethod2();
  }
}
 
$adapter1 = new adapters(new man);
$adapter1->newmethod1();
$adapter2 = new adapters(new woman);
$adapter2->newmethod2();

5、策略模式

这是一个男人和女人的问题,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。

userstrategy.php
<?php
/*
 * 声明策略文件的接口,约定策略包含的行为。
 */
interface userstrategy
{
  function showad();
  function showcategory();
}

femaleuser.php
<?php
class femaleuser implements userstrategy
{
  function showad(){
    echo "2016冬季女装";
  }
  function showcategory(){
    echo "女装";
  }
}

maleuser.php
<?php
class maleuser implements userstrategy
{
  function showad(){
    echo "iphone6s";
  }
  function showcategory(){
    echo "电子产品";
  }
}

page.php//执行文件
<?php
require_once 'loader.php';
class page
{
  protected $strategy;
  function index(){
    echo "ad";
    $this->strategy->showad();
    echo "<br>";
    echo "category";
    $this->strategy->showcategory();
    echo "<br>";
  }
  function setstrategy(userstrategy $strategy){
    $this->strategy=$strategy;
  }
}

$page = new page();
if(isset($_get['male'])){
  $strategy = new maleuser();
}else {
  $strategy = new femaleuser();
}
$page->setstrategy($strategy);
$page->index();

6、原型模式

不常用,大的对象类才使用,表现在clone

7、观察者模式

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了

/**
 * 事件产生类
 * class eventgenerator
 */
abstract class eventgenerator
{
  private $observers = [];

  //增加观察者
  public function add(observer $observer)
  {
    $this->observers[] = $observer;
  }

  //事件通知
  public function notify()
  {
    foreach ($this->observers as $observer) {
      $observer->update();
    }
  }

}

/**
 * 观察者接口类
 * interface observer
 */
interface observer
{
  public function update($event_info = null);
}

/**
 * 观察者1
 */
class observer1 implements observer
{
  public function update($event_info = null)
  {
    echo "观察者1 收到执行通知 执行完毕!\n";
  }
}

/**
 * 观察者1
 */
class observer2 implements observer
{
  public function update($event_info = null)
  {
    echo "观察者2 收到执行通知 执行完毕!\n";
  }
}

/**
 * 事件
 * class event
 */
class event extends eventgenerator
{
  /**
   * 触发事件
   */
  public function trigger()
  {
    //通知观察者
    $this->notify();
  }
}

//创建一个事件
$event = new event();
//为事件增加旁观者
$event->add(new observer1());
$event->add(new observer2());
//执行事件 通知旁观者
$event->trigger();

以上就是深入分析php设计模式的详细内容,更多关于php设计模式的资料请关注其它相关文章!

相关标签: PHP 设计 模式