单例
确保某个类只new一个对象,比如应该连接数据库的对象
class Single{
static private $obj = null;
private function __construct(){}
private function __clone(){}
public function getInstance(){
if(!self::$obj instanceof self){
self::$obj = new self();
}
return self::$obj
}
}工厂
工厂类使用静态方法来生产对象实例,返回对象
<?php
/**
*简单工厂模式(静态工厂方法模式)
*/
/**
* Interface people 人类
*/
interface people
{
public function say();
}
/**
* Class man 继承people的男人类
*/
class man implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是男人<br>';
}
}
/**
* Class women 继承people的女人类
*/
class women implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是女人<br>';
}
}
/**
* Class SimpleFactoty 工厂类
*/
class SimpleFactoty
{
public static function people($type){
switch($type){
case 'man' :
return new man();
break;
case 'women' :
return new women();
break;
} }
}
/**
* 具体调用
*/
$man = SimpleFactoty::people('man');
$man->say();
$woman = SimpleFactoty::people('women');
$woman->say();
注册树
把对象注册到全局树上,方便调用。结合单例、工厂模式demo
//使用单例 工厂 完成注册模式
class Single{
public $param;
static private $obj;
private function __consturct($param){
$this->param = $param;
}
private function __clone(){}
static public function getInstance($param){
if(!(self::$obj instanceof self)){
self::$obj = new self($param);
}
return self::$obj;
}
}
class RandFactory{
static public function factory(){
return Single::getInstance('haha');
}
}
class Register{
static private $objs;
static public function set($alias,$obj){
self::$objs[$alias] = $obj;
}
static public function get($alias){
return self::$objs[$alias];
}
static public function _unset($alias){
unset(self::$objs[$alias]);
}
}
Register::set('test',RandFactory::factory());
echo '<br/>';
var_dump(Register::get('test'));观察者
主题提供注册和通知的接口,观察者提供自身操作的接口。(这些观察者拥有一个同一个接口。)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。
//观察者设计模式
interface Subject {
public function register(Observer $observer);
public function notify();
}
interface Observer{
public function watch();
}
//主题
class Action implements Subject{
protected static $_observers = [];
//把观察者挂注册树上
public function register(Observer $observer){
self::$_observers[] = $observer;
}
public function notify(){
foreach(self::$_observers as $v){
echo $v->watch();
}
}
}
//观察者
class Dog implements Observer{
public function watch(){
return 'Dog watch';
}
}
class Cat implements Observer{
public function watch(){
return 'Dog watch';
}
}
$action = new Action();
$action->register(new Dog);
$action->register(new Cat);
$action->notify();使用观察者模式记录异常信息
//处理异常,有两个观察者,邮箱发送、文件日志
interface Exception_Observer{
public function watch(Exception_test $e);
}
class Exception_test extends Exception{
public static $_observers = [];
public static function register(Exception_Observer $observer){
self::$_observers[] = $observer;
}
public function __construct($message=null,$code=0){
parent::__construct($message,$code);
$this->notify();
}
private function notify(){
foreach(self::$_observers as $v){
$v->watch($this);
}
}
}
//观察者
class File1_Observer implements Exception_Observer{
public function watch(Exception_test $e){
$message="时间".date("Y-m-d H:i:s").PHP_EOL;
$message.="信息".$e->getMessage().PHP_EOL;
$message.="追踪信息".$e->getTraceAsString().PHP_EOL;
$message.="文件".$e->getFile().PHP_EOL;
$message.="行号".$e->getLine().PHP_EOL;
error_log($message,3,'F:/logException1.txt');
}
}
class File2_Observer implements Exception_Observer{
public function watch(Exception_test $e){
$message="时间".date("Y-m-d H:i:s").PHP_EOL;
$message.="信息".$e->getMessage().PHP_EOL;
$message.="追踪信息".$e->getTraceAsString().PHP_EOL;
$message.="文件".$e->getFile().PHP_EOL;
$message.="行号".$e->getLine().PHP_EOL;
error_log($message,3,'F:/logException2.txt');
}
}
class Email_Observer implements Exception_Observer{
public function watch(Exception_test $e){
$message="时间".date("Y-m-d H:i:s").PHP_EOL;
$message.="信息".$e->getMessage().PHP_EOL;
$message.="追踪信息".$e->getTraceAsString().PHP_EOL;
$message.="文件".$e->getFile().PHP_EOL;
$message.="行号".$e->getLine().PHP_EOL;
error_log($message,1,'******@qq.com');
}
}
Exception_test::register(new File1_Observer);
Exception_test::register(new File2_Observer);
Exception_test::register(new Email_Observer);
try {
throw new Exception_test("出现异常,记录一下");
} catch (Exception_test $e) {
echo $e->getMessage();
echo "<ht/>";
}适配器
在不修改原本api类的基础上,根据业务添加新的适配类
引用别人的案例