php工厂模式
工厂模式: 就是负责生成其他对象的类或方法。
代码 : 实现交通工具接口的类12345678910111213141516171819202122232425262728interface Vehicle{ public function drive();}class Car implements Vehicle{ public function drive() { echo '汽车靠四个轮子滚动行走。'; }}class Ship implements Vehicle{ public function drive() { echo '轮船靠螺旋桨划水前进。'; }}class Aircraft implements Vehicle{ public function drive() { echo '飞机靠螺旋 ...
委托模式
通过分配或委托至其他对象,委托设计模式能够去除核心对象的判决和复杂的功能性。
为其他对象提供一种代理以控制这个对象的访问。
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546class Bank{ protected $info; public function updateBrankInfo($type,$money){ $this->info[$type]=$money; } public function brankWithdraw($branktype){ $obj=new $branktype; return $obj->brankMain($this->info); }}/*委托接口*/interface Delegate{ public function brankMain($in ...
建造者模式
建造者模式主要是为了消除其它对象复杂的创建过程。
建造者设计模式定义了处理其他对象的复杂构建的对象设计。
普通构建类1234567891011121314151617181920212223242526272829303132333435/* 描述一个用户的类,包含用户姓名,年龄,金钱 */class UserInfo { protected $userName = ''; protected $userAge = ''; protected $userMoney = ''; public function setUserName($userName) { $this->userName = $userName; } public function setUserAge($userAge) { $this->userAge = $userAge; } public functio ...
数据访问对象模式
数据访问对象设计模式描述了如何创建提供透明访问任何数据源的对象。
示例代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374class Db_Mysql{ //数据库连接对象 protected $_conn; //初始化数据库连接 public function __construct($host, $user, $pass, $dbName) { $dsn = "mysql:host={$host};dbname={$dbName}"; $option = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\' ...
策略模式
定义一组相同类型的算法,算法之间独立封装,并且可以互相代替。
这些算法是统一类型问题的多种处理方式,但是具体行为存在差别。
每一个算法、或者说每一种处理方式称为一个策略。
在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
实例代码
123456789101112131415161718192021222324252627282930313233343536<?php//策略模式//cd类class Cd { protected $cdArr; public function __construct($title, $info) { $this->cdArr['title'] = $title; $this->cdArr['info'] = $info; } public function getCd($typeObj) { return $typeObj->get($this->cdA ...
装饰器模式
对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设计模式。
装饰器主要是不改变现有对象数据结构的前提
装饰器模式(Decorator),可以动态地添加修改类的功能
一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法
使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性
代码12345678910111213141516171819202122232425262728293031class UserInfo { public $userInfo = array(); public function addUser($userInfo) { $this->userInfo[] = $userInfo; } public function getUserList() { print_r($this->userInfo); }}class ...
php观察者模式
观察者模式也称之为发布-订阅模式。
观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性。
观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码耦合。
以一个购物流程为例子
123456789101112131415161718192021222324252627282930313233343536373839class order { protected $observers = array(); // 存放观察容器 //观察者新增 public function addObServer($type, $observer) { $this->observers[$type][] = $observer; } //运行观察者 public function obServer($type) { if (isset($this->observers[$type])) ...
解释器模式
解释器模式:用于分析一个实体的关键元素,并且针对每个元素提供自己的解释或相应动作。
解释器模式最常用于PHP/HTML模板系统中。
代码1234567891011121314151617181920212223class template { private $left = '<!--{'; private $right = '}-->'; public function run($str) { return $this->init($str, $this->left, $this->right); } /** * 模板驱动-默认的驱动 * @param string $str 模板文件数据 * @return string */ private function init($str, $left, $right) { $patt ...
迭代器
迭代器设计模式可以帮助构建特定对象,那些对象能够提供单一标准接口循环或代任何类型的可计数数据。12345678910111213141516171819202122232425262728293031323334353637class MyIterator implements Iterator { private $var = array(); public function __construct($array) { $this->var = $array; } public function rewind() { reset($this->var); } public function current() { $var = current($this->var); return $var; } public function valid() { $var = ...
适配器
适配器设计模式只是将某个对象的接口适配为另一个对象所期望的几口。
通过适配器设计模式(Adapter Design Pattern),编程人员能够使用新的代码和功能性来帮助更新原有的系统。
设计情景:
假如我们原始的有一个UserInfo的类,提供用户信息的类,早起设计该类的时候,只实现了一个getUserName获取用户名的方法。
我们的MyOldObject类中,将从UserInfo这个类中获取用户信息,并且输出用户名
随着时间的推移,我们旧的UserInfo这个类只提供的获取用户名的方法,已经没法满足需求,我们同时需要获取用户的年龄等信息。
为了不改变原本UserInfo这个类,我们就继承UserInfo,建立一个UserInfoAdapter类,实现getAge获取年龄这样的方法。
在我们的MyNewObject新的类中,我们实例化UserInfoAdapter,打印出用户姓名和年龄。
这样,随着我们的扩展,我们没有改变原先UserInfo这个类和使用这个类的接口,我们通过适配的方法,将UserInfo类扩展出来
代码:UserInfo类,实现getUserNa ...