php 设计模式备忘

  1. 单例模式用于:

不重复建立对象,节省内存。(PHP很容易卡死的,比如说递归20,30 层)比如用于数据库连接对象

class Single {
    private $name;//声明一个私有的实例变量
    private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
    
    }

    static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
    static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
        if(!self::$instance) self::$instance = new self();
        return self::$instance;
    }

    public function setname($n){ $this->name = $n; }
    public function getname(){ return $this->name; }
}

2.工厂模式用于:

应该TP里面的M方法建立迷行应该就是这样,感觉和单例还是很像的。

工厂模式就是一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new。这样如果想更改创建的对象类型,只需更改该工厂即可。

 class Factory {//创建一个基本的工厂类 
     static public function fac($id){//创建一个返回对象实例的静态方法 
         if(1 == $id) return new A(); 
         elseif(2==$id) return new B();
         elseif(3==$id) return new C(); 
         return new D(); 
 } 
 }

3.观察者模式:

针对一个博主,这是一个接口或者对象,里面可以注册观察者(关注者),然后遍历关注者,对每个人执行一个方法。例如这个样子:

<?php
	//主题
	class Paper{
		private $_observers = array();

		//注冊观察者,谁依赖我,谁是我的粉丝,我有动态,依次推送,都在观察关注我
		public function register($sub){
			$this->_observers[] = $sub; 
		}

		//外部统一访问
		public function trigger(){
			if(!empty($this->_observers)){
				foreach($this->_observers as $observer){
					$observer->update();//统一的方法,依次进行各个观察者
				}
			}

		}
	}

	//观察者实现接口

	interface Observerable{
		public function update();
	}

	class Subscriber implements Observerable{
		public function update(){
			echo "Callback\n";
		}
	}

	$paper = new Paper();

	$paper->register(new Subscriber());
	$paper->trigger();

4.策略模式

针对同一个行为,你有不同的方案,就可以写成策略,就是一个大的算法集合。再比如你定价有不同的活动,满200-10,满400-100等,都是一个小算法,集合成策略

<?php
	interface FlyBehavior{
		//策略接口
		public function fly();
	}

	class FlyWithWings implements FlyBehavior{
		//c策略1
		public function fly(){
			echo "Fly with Wings";
		}
	}

	class FlyWithNo implements FlyBehavior{
		//c策略2
		public function fly(){
			echo "Fly with No Wings";
		}
	}

	class Duck{
		private $_flyBehavior;
		public function performFly(){
			$this->_flyBehavior->fly();
		}
		//这里引进来策略,可以切换不同的策略
		public function setFlyBehavior(FlyBehavior $behavior){
			$this->_flyBehavior = $behavior;
		}
	}

	class RubberDuck extends Duck{

	}

	$duck = new RubberDuck();
	$duck->setFlyBehavior(new FlyWithWings());
	$duck->performFly();

	$duck->setFlyBehavior(new FlyWithWings());
	$duck->performFly();

5.装饰者模式

就是给被装饰者增加属性的,之后你就可以取代被装饰者。其实一个明显的例子就是穿衣服的顺序和方案。因为你有很多的方案可以动态加进去。这样的话比生成子类好很多,就不用把每个方案都建立对象,然后执行方法。

不恰当的示例如下:

$a = new a(new person());

$a.show();

$b=new b(new person());

$b.show();

$c = new c(new person());

$c.show();

改进的方案如下:首先把a,b,c 写一个抽象的接口统一起来,然后在面对被装饰者person()

<?php
	//抽象类不能实例化
	abstract class Beverage{
		public $_name;//品类名
		abstract public function Cost();//费用
	}

	//被装饰者,都是给coffee加东西
	class Coffee extends Beverage{
		public function __construct(){
			$this->_name = ‘Coffee‘;//品类名
		}
		public  function Cost(){
			return 1.00;//原味咖啡的底价
		}
	}

	//以下三个类是装饰者相关类
	class CondimentDecorator extends Beverage{
		public function __construct(){
			$this->_name = ‘Condiment‘;
		}
		public function Cost(){
			return 0.1;
		}
	}

	class Milk extends CondimentDecorator{
		public $_beverage;//被装饰者
		public function __construct($beverage){
			$this->_name = ‘Milk‘;//该品种名
			if($beverage instanceof Beverage){
				$this->_beverage = $beverage;
			}else{
				exit(‘Failure‘);
			}
		}

		public function Cost(){
			return $this->_beverage->Cost()+0.2;//底价加上新加的东西
		}
	}

	class Sugar extends CondimentDecorator{
		public $_beverage;//被装饰者
		public function __construct($beverage){
			$this->_name = ‘Sugar‘;//该品种名
			if($beverage instanceof Beverage){
				$this->_beverage = $beverage;
			}else{
				exit(‘Failure‘);
			}
		}

		public function Cost(){
			return $this->_beverage->Cost()+0.2;//底价加上新加的东西
		}
	}

	//拿杯咖啡
	$coffee = new Coffee();
	//加点牛奶
	$coffee = new Milk($coffee);
	//加点糖
	$coffee = new Sugar($coffee);

	echo "Coffee现在的总价格是".$coffee->Cost();

	//总结:
	//1.装饰者和被装饰者必须是同一类型,因为装饰者可以取代它
	//2.当装饰者和组件组合的时候,就是在加入新的行为
时间: 2024-10-12 02:58:03

php 设计模式备忘的相关文章

11. 星际争霸之php设计模式--备忘模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248190.html============================================

PHP设计模式之备忘模式

1.Norton Ghost的方便与问题 我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton Ghost恢复一下就回到备份时候的样子了. 这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复.因此备忘模式是比较好理解的. 但在实际应用中,如何正确的应用备忘模式,是需要注意的. 难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘? 就

Objective-C教程备忘单

终极版本的Objective-C教程备忘单帮助你进行iOS开发. 想开始创建你的第一个iOS应用程序么?那么看一下这篇很棒的教程吧:Create your first iOS 7 Hello World Application 注:这篇文章我写了三天,可能在一些必要的地方使用了编辑和说明,所以如果有任何疑问和修改建议请在下方评论. 这不是一个初学者指南,也不是关于Objective-C的详细讨论,这是关于常见的和高水平的论题的快速索引. 如果这里有些问题没有涉及到,你也可以查阅以下文章: Obj

RxJava & RxAndroid备忘

"你问我要去向何方,我指着大海的方向" 今天在刷G+的时候看到Dave Smith推荐了一个视频 <Learning RxJava (for Android) by example> 点进去看了一下,原来是位熟悉的"阿三哥",视频封面如下:(没有歧视的意思,不要喷我啊~,为什么感到熟悉?接着往下看) 几乎同时也看到了JetBrains在G+也推荐了篇在Medium上的博文 <RxAndroid And Kotlin (Part 1)> ,然后

工作备忘:cacti&nagios登录密码修改方法

[[email protected]]# mysql -u root -p mysql> use cacti; mysql> select * from user_auth; mysql> update user_auth set password=md5("cactipasswd") where id='1'; 现在cacti登录的新密码就是cactipasswd [[email protected]]# /usr/bin/htpasswd /usr/local/n

备忘-linux文件系统结构

用apache的时候总是要进入/var/www, 用久了开始好奇这些个目录都是派什么用处的,简单整理了一下 /bin 存放二进制命令文件,这个目录下面不允许存在子目录/boot bootloader的静态文件,当然OS的文件也必须在这里/dev 设备文件,MAKEDEV命令可以创建设备/etc 特定主机的配置文件,必须是静态文件,非可执行文件: opt, X11, sgml, xml/home 用户目录 /lib 存放主要的共享库和核心模块/media 可移除媒体的挂载点: floppy, cd

[转]Windows环境下尝试安装并配置PHP PEAR备忘

转自:http://wangye.org/blog/archives/266/ 什么是PEAR 来自百度百科:PEAR 是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写.它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR之于PHP就像是CPAN(Comprehensive Perl Archive Network)之于Perl. 由此可见PEAR是PHP代码的仓库,在这里可以找到很多有用的代码,避免我们重复写一些功能,

Table view 备忘

Table view 备忘 本篇会以备忘为主,主要是一些基础的代理方法和数据源方法具体的优化好点子会后续跟上. Table view的数据源方法 必须实现的数据源方法 // 返回每一行的cell,可以做缓存处理,同样也可能会造成复用问题. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // tableview 和 cell 都是在s

oracle下 启动subversion命令 及 oracle相关服务启动备忘

linux shell下  svnserve - d -r + 目录   例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. 启动oracle: 一.如何启动数据库实例 1.进入到sqlplus启动实例 [[email protected] ~]$ su - oracle --“切换到oracle用户” 2. Password: [[email protected] ~]$ lsnrctl start  --“打开监听”