php面向对象基础知识 请点击查看
一、常见的设计模式主要有23种,根据使用目标的不同可以分为以下三大类:创建设计模式、结构设计模式、行为模式
创建设计模式: (5种)
用于创建对象时的设计模式.初始化对象流程的设计模式.当程序复杂时,需要灵活创建对象,同时减少创建时的依赖.创建设计模式就是解决此问题的一类设计模式.
(1)单例模式
(2)工厂模式
(3)抽象工厂模式
(4)建造者模式
(5)原型模式
结构设计模式: (7种)
用于继承和接口时的设计模式.结构设计模式用于新类的函数方法设计,减少不必要的类定义,减少代码的冗余.
(1)适配器模式
(2)桥接模式
(3)合成模式
(4)装饰器模式
(5)门面模式
(6)代理模式
(7)享元模式
行为模式: (11种)
用于方法实现以及对应算法的设计模式,同时也是最复杂的设计模式.行为设计模式不仅仅用于定义类的函数行为,同时也用于不同类之间的协议、通信.
(1)策略模式
(2)模板方法模式
(3)观察者模式
(4)迭代器模式
(5)责任链模式
(6)命令模式
(7)备忘录模式
(8)状态模式
(9)访问者模式
(10)中介者模式
(11)解释器模式
二、按照范围分为: 类的设计模式,以及对象设计模式
类的设计模式:用于类的具体实现的设计模式.包含了如何设计和定义类,以及父类和子类的设计模式.
对象设计模式: 用于对象的设计模式.与类的设计模式不同,对象设计模式主要用于运行期对象的状态改变、动态行为变更等.
三、设计模式六大原则
开放封闭原则: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭.
里氏替换原则: 所有引用基类的地方必须能透明地使用其子类的对象.
依赖倒置原则: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象.
单一职责原则: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责.
接口隔离原则: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上.
迪米特法则: 一个对象应该对其他对象保持最少的了解.
单例模式
单例模式解决的是如何在整个项目中创建唯一对象实例的问题. (示例demo:)
1 <?php
2 //单例模式:保证某个类只有一个实例,能自行实例化对象,完成其所有的功能操作.
3 //最典型案例:数据库操作(单例模式可以避免大量的new操作.每一次new操作都会消耗系统和内存的资源.)
4 header("Content-Type: text/html;charset=utf-8");
5 class User{
6 //静态的私有属性(保存一个当前类的唯一对象)
7 private static $instance;
8 //私有的构造方法,防止类外new新对象
9 private function construct(){
10 }
11 //私有的克隆方法,防止类外克隆新对象
12 private function clone(){
13
14 }
15 //静态的公开方法,得到当前类的对象
16 public static function getInstance(){
17 if(!self::$instance){
18 self::$instance = new self();
19 }
20 return self::$instance;
21 }
22
23 private $name;
24 public function setName($n){
25 $this->name = $n;
26 }
27 public function getName(){
28 echo $this->name;
29 }
30
31 }//代码效果参考:http://www.ezhiqi.com/zx/art_1300.html
32 $userA = User::getInstance();
33 $userB = User::getInstance();
34 echo '
'.'单例模式获取唯一实例:'.'
';
35 var_dump($userA,$userB);
36
37 echo ''.'单例模式获取当前类私有属性:'.'
';
38 $userA->setName('admin_a');
39 $userB->setName('admin_b');
40 $userA->getName();
41 echo '
';
42 $userB->getName();
运行结果如下图:
工厂模式
工厂模式解决的是如何不通过new建立实例对象的方法. (示例demo)
1 <?php
2 //工厂模式:实例化对象模式,工厂方法代替new操作的一种设计模式.
3 //优点:避免当改变某个类的名字或者方法之后,调用这个类的所有的代码中都修改它的名字或者参数.(为系统结构提供灵活的动态扩展机制,减少了耦合)
4 //简单工厂模式生产对象 实例demo
5 interface People{
6 public function sex();
7 }
8
9 class Man implements People{
10 public function sex(){
11 echo 'this is Men'.'
';
12 }
13 }
14
15 class Women implements People{
16 public function sex(){
17 echo 'this is Women'.'
';
18 }
19 }
20
21 class Factoty{
22 static function getObject($class_name){
23 //可变类,生产新对象
24 return new $class_name;
25 }
26 }
27
28 $man = Factoty::getObject('Man');
29 $man->sex();
30 $woman = Factoty::getObject('Women');
31 $woman->sex();
运行结果如下图:
观察者模式
当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新. (示例demo)
1 <?php
2 //观察者模式:某个对象可以被设置为是可观察的,只要通过某种方式允许其他对象注册为观察者.每当被观察的对象改变时,会发送信息给观察者
3
4 //获取类名和发送消息接口
5 interface IObserver{
6 public function onSendMsg($msg);
7 public function getName();
8 }
9 //添加可观察者接口
10 interface IObservable{
11 //注意:$observer是个对象,需要保存到数组中
12 public function addObserver($observer);
13 }
14
15 class UserList implements IObservable{
16 private $_observers = array();
17 //添加观察者
18 public function addObserver($observer){
19 $a=$this->_observers【】= $observer;
20 }
21 //移除观察者 (注意:其实就是移除对应的类)
22 public function removeObserver($observer_name) {
23 foreach($this->_observers as $index => $observer) {
24 if ($observer->getName() === $observer_name) {
25 //从数组中移除选定的元素
26 return array_splice($this->_observers, $index, 1);
27 }
28 }
29 }
30 //发送消息
31 public function sendMsg($msg){
32 foreach($this->_observers as $v){
33 $v->onSendMsg($msg);
34 }
35 }
36 }
37
38 class OneObserver implements IObserver{
39 public function onSendMsg($args){
40 echo($args.'=> send to OneObserver
');
41 }
42 public function getName(){
43 return 'OneObserver';
44 }
45 }
46
47 class TwoObserver implements IObserver{
48 public function onSendMsg($args){
49 echo($args.'=> send to TwoObserver
');
50 }
51 public function getName(){
52 return 'TwoObserver';
53 }
54 }
55
56 $ul = new UserList();//被观察者
57 $ul->addObserver(new OneObserver());//增加观察者
58 $ul->addObserver(new TwoObserver());//增加观察者
59 $ul->sendMsg('admin');//发送消息到观察者
60 $ul->removeObserver('OneObserver');//移除观察者
61 $ul->sendMsg("hello world");//发送消息到观察者
运行结果如下图:
策略模式
策略模式主要为了让客户类能够更好地使用某些算法而不需要知道其具体的实现. (示例demo)
1 <?php
2 interface Strategy { //抽象策略角色,以接口实现
3 public function do_method(); //算法接口
4 }
5
6 class ConcreteStrategyA implements Strategy { //具体策略角色A
7 public function do_method() {
8 echo 'do method A';
9 }
10 }
11
12 class ConcreteStrategyB implements Strategy { //具体策略角色B
13 public