深入php设计模式,深入分析PHP设计模式

本文深入剖析了PHP中的七种设计模式:单例模式用于确保类只有一个实例;工厂模式用于解耦对象的创建和使用;注册模式用于全局共享和交换对象;适配器模式实现不同接口之间的转换;策略模式根据上下文选择合适的行为;原型模式通过克隆创建对象;观察者模式则实现了发布-订阅模式,使得对象间能进行通信。这些模式在实际开发中具有很高的实用价值。
摘要由CSDN通过智能技术生成

1、单例模式

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

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、注册模式

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

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

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

/*

* 声明策略文件的接口,约定策略包含的行为。

*/

interface UserStrategy

{

function showAd();

function showCategory();

}

FemaleUser.php

class FemaleUser implements UserStrategy

{

function showAd(){

echo "2016冬季女装";

}

function showCategory(){

echo "女装";

}

}

MaleUser.php

class MaleUser implements UserStrategy

{

function showAd(){

echo "IPhone6s";

}

function showCategory(){

echo "电子产品";

}

}

Page.php//执行文件

require_once 'Loader.php';

class Page

{

protected $strategy;

function index(){

echo "AD";

$this->strategy->showAd();

echo "
";

echo "Category";

$this->strategy->showCategory();

echo "
";

}

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设计模式的资料请关注脚本之家其它相关文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值