首先什么是设计模式呢?我们知道,程序是为了解决实际问题应运而生的,刚开始肯定也只是简单的面向过程拿来即用,但随着业务逻辑的复杂和管理难度的增加,原来单纯的调用方法走天下的道路走不通了,(或者说增加了开发成本和后期维护成本,怎么可能走不通呢!!只能说不合适了),这时候就产生了设计模式,就是说人们按照一些约定俗成的用法(程序本身没有要求)去完成一些功能和逻辑的方法叫做设计模式。----这是我个人的定义啊,对不对的不知道啊20170528
任何新事物的诞生都是为了解决问题的,虽然程序开发过程中遇到的问题千千万,但总体来说也可以分类,所以针对每一种不同类型的问题可以有不同的设计模式去应对(你代码运行效率低下不是问题啊喂,那是你写的烂啊!!)好的,下面开始介绍几种设计模式
1 单例模式
额,名字起的不够明白(或者是我理解能力不行),从名称上来看完全不知道它要干嘛啊。好吧,从名字上还是完全可以理解的,单例模式很明显只有一个实例化的对象,一个类只有一个实例化的对象,系统运行过程中自行实例化,像系统提供这个实例。
解决问题(即为什么要用到单例模式):避免重复实例化带来的内存消耗。
优点:节省内存
缺点:PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
实际操作场景:数据库操作类、全局包含配置参数的类
这是我写的代码:
<?php
/**
* description 单利模式 sington pattern
* author zhuxinlei
* date 20170617
* detail 避免重复实例化带来的内存消耗
*/
class singleton{
protected $instance;
public static function construct(){
}
/**
* 设置成静态,防止实例化该类
*/
public static function getInstance(){
if(!self::$instance){
self::$instance = self::getObject();
}
}
public function getObject(){
return $object = mysql_connect();
}
}
$object = singleton::getInstance();
?>
以下是能运行的
这里写代码片
<?php
class User {
//静态变量保存全局实例
private static $_instance = null;
//私有构造函数,防止外界实例化对象
private function __construct() {
}
//私有克隆函数,防止外办克隆对象
private function __clone() {
}
//静态方法,单例统一访问入口
static public function getInstance() {
if (is_null ( self::$_instance ) || isset ( self::$_instance )) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function getName() {
echo 'hello world!';
}
}
?>
2 工厂模式
解决问题:为创建对象提供过渡接口,提高代码灵活性。
3 观察者模式
解决问题:降低观察者和被观察者之间的耦合,可以使各业务逻辑分离,使代码可读性大大提高,降低维护代码的成本
实际案例:现有一业务逻辑是这样的,用户留言系统,用户留言之后需要进行以下操作 :插入留言表->插入记录表->给用户发送短信->给用户发送邮件->更新缓存。不适用设计模式的情况下的代码是这样的,按照以上逻辑代码顺序编写,要执行5步操作,繁琐复杂的逻辑代码在一个页面里,对于开发和后期维护都是一个不小的挑战。试想,如果业务逻辑发生了变化,想要在用户发送短信之前先验证一下用户的手机号(这是非常正常的)或者在插入留言表之后要更新一下用户的某个状态值,那就要求我们在原先的业务逻辑上去修改代码,如果我们对业务逻辑不熟悉的情况下直接上手修改很明显需要浪费很长的时间,要考虑上下文之间的联系,这就大大增加了我们的维护成本。但如果我们使用了观察者设计模式就可以将以上5个逻辑操作分割开,放在五个组件互不相连,每次改动的时候直接找到相关的组件修改即可。如果要在添加一块业务逻辑也只需要添加一个组件即可,非常方面,维护起来也很简单。
<?php
interface ICommand
{
function onCommand( $name, $args );
}
class CommandChain
{
private $_commands = array();
public function addCommand( $cmd )
{
$this->_commands []= $cmd;
}
public function runCommand( $name, $args )
{
foreach( $this->_commands as $cmd )
{
if ( $cmd->onCommand( $name, $args ) )
return;
}
}
}
class UserCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'addUser' ) return false;
echo( "UserCommand handling 'addUser'\n" );
return true;
}
}
class MailCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'mail' ) return false;
echo( "MailCommand handling 'mail'\n" );
return true;
}
}
$cc = new CommandChain();
$cc->addCommand( new UserCommand() );
$cc->addCommand( new MailCommand() );
$cc->runCommand( 'addUser', null );
$cc->runCommand( 'mail', null );
?>