策略模式
简介:策略模式是对象的行为模式,用意是对一组算法的封装。动态选择需要的算法并且使用。
策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大。
策略模式的三个角色:
1,抽象策略角色,
2,具体策略角色
3,环境角色
如果我需要在早晨从家里出发去上班,我可以有几个策略考虑:我可以乘坐地铁,乘坐公交车,走路或其它的途径。每个策略可以得到相同的结果,但是使用了不同的资源。
代码:
<?php
abstract class baseAgent {
//抽象策略类
abstract function PrintPage();
}
//用于客户端是IE时调用的类(环境角色)
class ieAgent extends baseAgent {
function PrintPage(){
return 'IE';
}
}
?>
工厂模式
工厂模式,工厂方法或者类生成对象,而不是在代码中直接new对象;
使用工厂方法,可以避免在改变某个类的名字后或则方法之后,在调用这个类的所有的代码中都修改它的名字或则参数;
test1.php
<?php
class Test1{
static function test(){
echo __FILE__;
}
}
?>
Factory.php
<?php
class Factory{
/**
如果某个类在很多文件中都 new className(), 万一这个类的名字发生变化或则参数发生变化,
如果不使用工厂模式,就需要修改每一个php代码,使用了工厂模式后,就 直接修改工厂类或则
方法就可以了。
**/
static function createDatabase(){
$test = new Test1();
return $test;
}
}
?>
Test.php
<?php
spl_autoload_register('autoload1',function($class){
$dir = __DIR__;
$requireFile = $dir . "\\".$class.".php";
include $requireFile;
});
$test = Factory::createDatabase();
$test -> test();
?>
注册模式
注册模式:主要用于解决全局共享和交换对象。已经创建好的对象,挂到某个全局可以使用的数组上,在需要的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方都可以访问。
<?php
class Register{
protected static $object;
function set($alias , $object){ //将对象注册到树上。
self::$object[$alias] = $object; //将对象放树上
}
static function get($name){
return self::$object[$name]; // 获取某个注册到树上的对象
}
function __unset($alias){
unset(self::$object[$alias]);
}
}
?>
观察者模式
1,当一个对象状态发生变化时候,依赖它的对象都会收到通知,并且自动更新。
2,一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。
3:观察者模式实现了低耦合,非侵入式的通知与更新机制。
定义一个事件触发抽象类,
EventGenerator.php
<?php
abstract class EventGenertor{
private $observers = array();
function addObserver(Observer $observer){
$this -> observers[] = $observer;
}
function notify(){
foreach($this -> observers as $observer){
$observer -> update();
}
}
}
?>
定义一个观察者接口
Observer.php
interface Observer{
function update();
}
<?php
//一个实现了EventGenerator抽象类的类,用来具体定义某个事件的发生
class Event extends EventGenerator{
function trigger(){
echo "event";
}
}
class Observer1 implements Observer{
function update(){
echo "update1 ";
}
}
class Observer2 implements Observer{
function update(){
echo "update2";
}
}
$event = new Event();
$event -> addObserver(new Observer1());
$event -> addObserver(new Observer2());
$event -> trigger();
$event -> notify();
?>
//当某个事件发生后,需要执行的逻辑增多时,可以以松耦合的方式去增删逻辑。
只需要定义一个实现了观察者接口的类,实现复杂的逻辑,然后在红色的部分加上一行代码即可。这样实现了低耦合。
装饰器模式
1:装饰器模式,可以动态的添加修改类的功能
2:一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法
3:使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。