文档章节

PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

lilugirl
 lilugirl
发布于 2014/03/25 23:40
字数 1121
阅读 259
收藏 3

第二章 面向对象的设计原则

2.1 面向对象设计的五大原则

单一职责原则
接口隔离原则
开放-封闭原则
替换原则

依赖倒置原则

2.1.1 单一职责原则SRP

单一职责有两个含义:一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多的职责。

原因 1可以减少类之间的耦合 2提高类的复用性

class Config{
  public $host="localhost";
  static $port="3306";
  static $user="root";
  static $password="";
  public $charset="utf8";
  public $database="test";
  public $file="";
}
interface Db_Adapter{
   public function connect($config);
   public function query($query,$handle);
}



class Db_Adapter_Mysql implements Db_Adapter{
   private $_dbLink;
   public function connect($config)
   {
      if($this->_dbLink=@mysql_connect($config->host.(empty($config->port)?'':':'.$config->port),$config->user,$config->password,true)){
	       if(@mysql_select_db($config->database,$this->_dbLink)){
		      if($config->charset){
			      mysql_query("SET NAMES '{$config->charset}'",$this->_dbLink);
			  }
			
			  return $this->_dbLink;
		   }
	  }
	  /**数据库异常**/
	  throw new Db_Exception(@mysql_error($this->_dbLink));
   }
   
   public function query($query,$handle){
       if($resource=@mysql_query($query,$handle)){
	      return $resource;
	   }
   }
}
class Db_Exception extends exception{
    function __toString(){
     return "<div style='color:red'>Exception{$this->getCode()}:{$this->getMessage()} in File:{$this->getFile()} on line:{$this->getLine()}</div>";

  }
}

class Db_Adapter_sqlite implements Db_Adapter{
  private $_dbLink;
  
  public function connect($config){
      if($this->_dbLink=sqlite_open($config->file,0666,$error)){
	      return $this->_dbLink;
	  }
	  throw new Db_Exception($error);
  }
  
  public function query($query,$handle){
      if($resource=@sqlite_query($query,$handle)){
	       return $resource;
	  }
  }
}

class sqlFactory{
   public static function factory($type){
       $classname='Db_adapter_'.$type;
	   return new $classname;
   }
}

$config=new Config();
$connect=sqlFactory::factory("mysql")->connect($config); 
$connect=sqlFactory::factory("SQLite")->connect($config);


class cook{
  public function meal(){
     echo "番茄炒蛋",PHP_EOL;
  }
  public function drink(){
     echo "紫菜蛋花汤",PHP_EOL;
  }
  
  public function ok(){
     echo '完毕',PHP_EOL;
  }
}

interface Command{
   public function execute();
}

class MealCommand implements Command{
   private $cook;
   public function __construct(cook $cook){
      $this->cook=$cook;
   }
   public function execute(){
      $this->cook->meal();
   }
}

class DrinkCommand implements Command{
    private $cook;
	public function __construct(cook $cook){
	    $this->cook=$cook;
	}
	public function execute(){
	   $this->cook->drink();
	}
}

class cookControl{
   private $mealcommand;
   private $drinkcommand;
   
   public function addCommand(Command $mealcommand,Command $drinkcommand){
      $this->mealcommand=$mealcommand;
	  $this->drinkcommand=$drinkcommand;
   }
   
   public function callmeal(){
      $this->mealcommand->execute();
   }
   
   public function calldrink(){
      $this->drinkcommand->execute();
   }
}

$control=new cookControl;
$cook=new cook;
$mealcommand=new MealCommand($cook);
$drinkcommand=new DrinkCommand($cook);
$control->addCommand($mealcommand,$drinkcommand);
$control->callmeal();
$control->calldrink();


2.1.2 接口隔离原则 ISP

利用委托分离接口
利用多继承分离接口

2.1.3 开放-封闭原则 OCP

1.什么是开放-封闭原则
一个模块在扩展性方面应该是开放的而在更改性能方面应该是封闭的。

interface process{
  public function process();
}

class playerencode implements process{

   public function process(){
      echo "encode\r\n";
   }
}

class playeroutput implements process{
   public function process(){
       echo "output\r\n";
   }
}

class playProcess{
  private $message=null;
  public function __construct(){
  }
  
  public function callback(event $event){
     $this->message=$event->click();
	 if($this->message instanceof process){
	     $this->message->process();
	 }
  }
}

class mp4{
   public function work(){
        $playProcess=new playProcess();
		$playProcess->callback(new event('encode'));
		$playProcess->callback(new event('output'));
   }
}

class event{
  private $m;
  public function __construct($me){
      $this->m=$me;
  }
  public function click(){
      switch($this->m){
	      case 'encode':
		  return new playerencode();
		  break;
		  case 'output':
		  return new playeroutput();
		  break;
	  }
  }
}

$mp4=new mp4;
$mp4->work();


2 如何遵守开放-封闭原则
1)在设计方面充分应用 “抽象”和“封装”的思想。
2)在系统功能编程实现方面应用面向接口的编程。 

2.1.4 替换原则 LSP

子类必须能够替换掉它们的父类型,并且出现在父类型能够出现的任何地方。

2.1.5 依赖倒置原则 DIP

上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)
抽象不能依赖于具体,具体应该依赖于抽象。

2.2 一个面向对象留言本的实例

class message{
   public $name;
   public $email;
   public $content;
   public function __set($name,$value){
       $this->name=$value;
   }
   
   public function __get($name){
       if(!isset($this->$name)){
	       $this->$name=NULL;
	   }
	  
   }
}



class gbookModel{
   private $bookPath;
   private $data;
   public function setBookPath($bookPath){
      $this->bookPath=$bookPath;
   }
   
   public function getBookPath(){
     return $this->bookPath;
   }
   public function open(){
   }
   public function close(){
   }
   public function read(){
       return file_get_contents($this->bookPath);
   }
   
   public function write($data){
       $this->data=self::safe($data)->name."&".self::safe($data)->email."\r\nsaid:\r\n".self::safe($data)->content;
	   return file_put_contents($this->bookPath,$this->data,FILE_APPEND);
   }
   
   public static function safe($data){
         $reflect=new ReflectionObject($data);
	     $props=$reflect->getProperties();
		 $messagebox=new stdClass();
		 foreach($props as $prop){
		     $ivar=$prop->getName();
			 $messagebox->$ivar=trim($prop->getValue($data));
		 }
		 return $messagebox;
	  }
  
   
   public function delete(){
      file_put_contents($this->bookPath,'it\'s empty now');
   }
   
   
   public function readByPage(){
      $handle=file($this->bookPath);
	  $count=count($handle);
	  $page=isset($_GET['page'])? intval($_GET['page']):1;
	  if($page<1 || $page>$count) $page=1;
	  $pnum=9;
	  $begin=($page-1)*$pnum;
	  $end=($begin+$pnum)>$count?$count:$begin+$pnum;
	  for($i=$begin;$i<$end;$i++){
	      echo '<strong>',$i+1,'</strong>',$handle[$i],'<br/>';
	  }
	  for($i=1;$i<ceil($count/$pnum);$i++){
	      echo "<a href=?page=${i}>${i}</a>";
	  }
   }
}

class leaveModel{
   public function write(gbookModel $gb,$data){
      $book=$gb->getBookPath();
	  $gb->write($data);
   }
}

class authorControl{
   public function message(leaveModel $l,gbookModel $g,message $data){
       $l->write($g,$data);
	   
   }
   
   public function view(gbookModel $g){
       return $g->read();
	  
   }
   public function viewByPage(gbookModel $g){
      return $g->readByPage();
   }
   
   public function delete(gbookModel $g){
       $g->delete();
	   echo self::view($g);
   }
   
   
}

$message=new message;
$message->name='lilu';
$message->email='lilugirl2005@126.com';
$message->content='a crazy phper love php so much.';
$gb=new authorControl();
$pen=new leaveModel();
$book=new gbookModel();
$book->setBookPath("C:\wamp2\a.txt");
$gb->message($pen,$book,$message);
//echo $gb->view($book);
echo $gb->viewByPage($book);
//$gb->delete($book);


2.3 面向对象的思考

© 著作权归作者所有

lilugirl
粉丝 97
博文 445
码字总数 128310
作品 0
杨浦
程序员
私信 提问
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
敏捷教练成长记:漫漫长路第三周

看到跆拳道的软文,讲到: 学跆拳道的正确顺序: 第一阶段:有兴趣 第二阶段:没兴趣 第三阶段:逼练习 第四阶段:成习惯 第五阶段:有兴趣 第六阶段:真热爱 大部分家长在孩子第二阶段时放弃...

转型实践者
2017/11/17
0
0
读书笔记:A Philosophy of Software Design (一)

今天一位同事在斯坦福的博士生导师John Ousterhout (注,Tcl语言的设计者)来公司做了他的新书《A Philosophy of Software Design》的演讲,介绍了他对于软件设计的思考。这里我把本书的读书...

naughty
2018/09/01
3.7K
0
设计模式之禅(第2版).epub

【下载地址】 本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领...

winter730
2018/05/16
0
0
开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
16
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部