php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式)
2017-03-23 19:08
776 查看
[php] view
plain copy
print?
<?php
/**
*适配器模式*
*将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作*/
//这个是原有的类型
class OldCache{
public function __construct()
{
echo "Old Cache construct<br/>";
}
public function store($key, $value)
{
echo "Old Cache store<br/>";
}
public function remove($key)
{
echo "Old Cache remove<br/>";
}
public function fetch($key)
{
echo "Old Cache fetch<br/>";
}
}
interface Cacheable
{
public function set($key, $value);
public function get($key);
public function del($key);
}
class OldCacheAdapter implements Cacheable
{
private $_cache = null;
public function __construct()
{
$this->_cache = new OldCache();
}
public function set($key, $value)
{
return $this->_cache->store($key, $value);
}
public function get($key)
{
return $this->_cache->fetch($key);
}
public function del($key)
{
return $this->_cache->remove($key);
}
}
$objCache = new OldCacheAdapter();
$objCache->set("test", 1);
$objCache->get("test");
$objCache->del("test", 1);
[php] view
plain copy
print?
<?php
/**
*模板模式*
*定义一个操作中的算法骨架,而将一些步骤延迟到子类中,
* 使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤**/
abstract class TemplateBase
{
public function Method1()
{
echo "abstract Method1<br/>";
}
public function Method2()
{
echo "abstract Method2<br/>";
}
public function Method3()
{
echo "abstract Method3<br/>";
}
public function doSomeThing()
{
$this->Method1();
$this->Method2();
$this->Method3();
}
}
class TemplateObject extends TemplateBase
{
}
class TemplateObject1 extends TemplateBase
{
public function Method3()
{
echo "Template Object1 Method3<br/>";
}
}
class TemplateObject2 extends TemplateBase
{
public function Method2()
{
echo "Template Object2 Method2<br/>";
}
}
//实例化
$objTemplate = new TemplateObject();
$objTemplate1 = new TemplateObject1();
$objTemplate2 = new TemplateObject2();
$objTemplate->doSomeThing();
$objTemplate1->doSomeThing();
$objTemplate2->doSomeThing();
[php] view
plain copy
print?
<?php
/**
*命令模式*
*将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,
* 对请求排除或记录请求日志,以及支持可取消的操作*/
interface Command
{
public function execute();
}
class Invoker
{
private $_command = array();
public function setCommand($command)
{
$this->_command[] = $command;
}
public function executeCommand()
{
foreach ($this->_command as $command) {
$command->execute();
}
}
public function removeCommand($command)
{
$key = array_search($command, $this->_command);
if ($key !== false) {
unset($this->_command[$key]);
}
}
}
class Receiver
{
private $_name = null;
public function __construct($name)
{
$this->_name = $name;
}
public function action()
{
echo $this->_name . "action<br/>";
}
public function action1()
{
echo $this->_name . "action1<br/>";
}
}
class ConcreteCommand implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
20000
$this->_receiver->action();
}
}
class ConcreteCommand1 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action1();
}
}
class ConcreteCommand2 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action();
$this->_receiver->action1();
}
}
$objRecevier = new Receiver("No.1");
$objRecevier1 = new Receiver("No.2");
$objRecevier2 = new Receiver("No.3");
$objCommand = new ConcreteCommand($objRecevier);
$objCommand1 = new ConcreteCommand1($objRecevier);
$objCommand2 = new ConcreteCommand($objRecevier1);
$objCommand3 = new ConcreteCommand1($objRecevier1);
$objCommand4 = new ConcreteCommand2($objRecevier2); //使用Recevier的两个方法
$objInvoker = new Invoker();
$objInvoker->setCommand($objCommand);
$objInvoker->setCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->removeCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->setCommand($objCommand2);
$objInvoker->setCommand($objCommand3);
[php] view
plain copy
print?
<?php
/**
*单例模式*
*保证一个类仅有一个实例,并提供一个访问它的全局访问点
**/
class Singleton
{
static private $_instance = null;
private function __construct()
{
}
static public function getInstance()
{
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
public function display()
{
echo "it is a singlton class function";
}
}
//$obj=new Singleton();
//声明不能成功$obj=Singleton::getInstance();var_dump($obj);$obj->display();
$obj1 = Singleton::getInstance();
[php] view
plain copy
print?
<?php
/**
*观察者模式*
*定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新
*能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能
*插件系统*/
class Observerable
{
private $_observers = array();
public function registerObserver($observer)
{
$this->_observers[] = $observer;
}
public function removeObserver($observer)
{
$key = array_search($observer, $this->_observers);
if (!($key === false)) {
unset($this->_observers[$key]);
}
}
public function notifyObservers()
{
foreach ($this->_observers as $observer) {
if ($observer instanceof Observer)
$observer->update($this);
}
}
}
interface Observer
{
public function update($observer);
}
interface DisplayElement
{
public function display();
}
//--实例类定义
class NewsObserverable extends Observerable
{
private $_sports_news;
public function setSportsNews($data)
{
$this->_sports_news = $data;
$this->notifyObservers();
}
public function getSportsNews()
{
return $this->_sports_news;
}
private $_local_news;
public function setLocalNews($data)
{
$this->_local_news = $data;
$this->notifyObservers();
}
public function getLocalNews()
{
return $this->_local_news;
}
}
class SportsNews implements Observer, DisplayElement
{
private $_data = null;
public function update($observer)
{
if ($this->_data != $observer->getSportsNews()) {
$this->_data = $observer->getSportsNews();
$this->display();
}
}
public function display()
{
echo $this->_data . date("Y-m-d H:i:s") . "<br/>";
}
}
class LocalNews implements Observer, DisplayElement
{
private $_data = null;
public function update($observer)
{
if ($this->_data != $observer->getLocalNews()) {
$this->_data = $observer->getLocalNews();
$this->display();
}
}
public function display()
{
echo $this->_data . date("Y-m-d H:i:s") . "<br/>";
}
}
//--实例化---
$objObserver = new NewsObserverable();
$local = new LocalNews();
$sports = new SportsNews();
$objObserver->registerObserver($local);
$objObserver->registerObserver($sports);
$objObserver->setSportsNews("sportsnews1");
$objObserver->setLocalNews("localnews1");
$objObserver->removeObserver($sports);
$objObserver->setLocalNews("localnews2");
$objObserver->setSportsNews("sportsnews2");
$objObserver->removeObserver($local);
$objObserver->setLocalNews("localnews3");
plain copy
print?
<?php
/**
*适配器模式*
*将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作*/
//这个是原有的类型
class OldCache{
public function __construct()
{
echo "Old Cache construct<br/>";
}
public function store($key, $value)
{
echo "Old Cache store<br/>";
}
public function remove($key)
{
echo "Old Cache remove<br/>";
}
public function fetch($key)
{
echo "Old Cache fetch<br/>";
}
}
interface Cacheable
{
public function set($key, $value);
public function get($key);
public function del($key);
}
class OldCacheAdapter implements Cacheable
{
private $_cache = null;
public function __construct()
{
$this->_cache = new OldCache();
}
public function set($key, $value)
{
return $this->_cache->store($key, $value);
}
public function get($key)
{
return $this->_cache->fetch($key);
}
public function del($key)
{
return $this->_cache->remove($key);
}
}
$objCache = new OldCacheAdapter();
$objCache->set("test", 1);
$objCache->get("test");
$objCache->del("test", 1);
[php] view
plain copy
print?
<?php
/**
*模板模式*
*定义一个操作中的算法骨架,而将一些步骤延迟到子类中,
* 使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤**/
abstract class TemplateBase
{
public function Method1()
{
echo "abstract Method1<br/>";
}
public function Method2()
{
echo "abstract Method2<br/>";
}
public function Method3()
{
echo "abstract Method3<br/>";
}
public function doSomeThing()
{
$this->Method1();
$this->Method2();
$this->Method3();
}
}
class TemplateObject extends TemplateBase
{
}
class TemplateObject1 extends TemplateBase
{
public function Method3()
{
echo "Template Object1 Method3<br/>";
}
}
class TemplateObject2 extends TemplateBase
{
public function Method2()
{
echo "Template Object2 Method2<br/>";
}
}
//实例化
$objTemplate = new TemplateObject();
$objTemplate1 = new TemplateObject1();
$objTemplate2 = new TemplateObject2();
$objTemplate->doSomeThing();
$objTemplate1->doSomeThing();
$objTemplate2->doSomeThing();
[php] view
plain copy
print?
<?php
/**
*命令模式*
*将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,
* 对请求排除或记录请求日志,以及支持可取消的操作*/
interface Command
{
public function execute();
}
class Invoker
{
private $_command = array();
public function setCommand($command)
{
$this->_command[] = $command;
}
public function executeCommand()
{
foreach ($this->_command as $command) {
$command->execute();
}
}
public function removeCommand($command)
{
$key = array_search($command, $this->_command);
if ($key !== false) {
unset($this->_command[$key]);
}
}
}
class Receiver
{
private $_name = null;
public function __construct($name)
{
$this->_name = $name;
}
public function action()
{
echo $this->_name . "action<br/>";
}
public function action1()
{
echo $this->_name . "action1<br/>";
}
}
class ConcreteCommand implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
20000
$this->_receiver->action();
}
}
class ConcreteCommand1 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action1();
}
}
class ConcreteCommand2 implements Command
{
private $_receiver;
public function __construct($receiver)
{
$this->_receiver = $receiver;
}
public function execute()
{
$this->_receiver->action();
$this->_receiver->action1();
}
}
$objRecevier = new Receiver("No.1");
$objRecevier1 = new Receiver("No.2");
$objRecevier2 = new Receiver("No.3");
$objCommand = new ConcreteCommand($objRecevier);
$objCommand1 = new ConcreteCommand1($objRecevier);
$objCommand2 = new ConcreteCommand($objRecevier1);
$objCommand3 = new ConcreteCommand1($objRecevier1);
$objCommand4 = new ConcreteCommand2($objRecevier2); //使用Recevier的两个方法
$objInvoker = new Invoker();
$objInvoker->setCommand($objCommand);
$objInvoker->setCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->removeCommand($objCommand1);
$objInvoker->executeCommand();
$objInvoker->setCommand($objCommand2);
$objInvoker->setCommand($objCommand3);
[php] view
plain copy
print?
<?php
/**
*单例模式*
*保证一个类仅有一个实例,并提供一个访问它的全局访问点
**/
class Singleton
{
static private $_instance = null;
private function __construct()
{
}
static public function getInstance()
{
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
public function display()
{
echo "it is a singlton class function";
}
}
//$obj=new Singleton();
//声明不能成功$obj=Singleton::getInstance();var_dump($obj);$obj->display();
$obj1 = Singleton::getInstance();
[php] view
plain copy
print?
<?php
/**
*观察者模式*
*定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新
*能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能
*插件系统*/
class Observerable
{
private $_observers = array();
public function registerObserver($observer)
{
$this->_observers[] = $observer;
}
public function removeObserver($observer)
{
$key = array_search($observer, $this->_observers);
if (!($key === false)) {
unset($this->_observers[$key]);
}
}
public function notifyObservers()
{
foreach ($this->_observers as $observer) {
if ($observer instanceof Observer)
$observer->update($this);
}
}
}
interface Observer
{
public function update($observer);
}
interface DisplayElement
{
public function display();
}
//--实例类定义
class NewsObserverable extends Observerable
{
private $_sports_news;
public function setSportsNews($data)
{
$this->_sports_news = $data;
$this->notifyObservers();
}
public function getSportsNews()
{
return $this->_sports_news;
}
private $_local_news;
public function setLocalNews($data)
{
$this->_local_news = $data;
$this->notifyObservers();
}
public function getLocalNews()
{
return $this->_local_news;
}
}
class SportsNews implements Observer, DisplayElement
{
private $_data = null;
public function update($observer)
{
if ($this->_data != $observer->getSportsNews()) {
$this->_data = $observer->getSportsNews();
$this->display();
}
}
public function display()
{
echo $this->_data . date("Y-m-d H:i:s") . "<br/>";
}
}
class LocalNews implements Observer, DisplayElement
{
private $_data = null;
public function update($observer)
{
if ($this->_data != $observer->getLocalNews()) {
$this->_data = $observer->getLocalNews();
$this->display();
}
}
public function display()
{
echo $this->_data . date("Y-m-d H:i:s") . "<br/>";
}
}
//--实例化---
$objObserver = new NewsObserverable();
$local = new LocalNews();
$sports = new SportsNews();
$objObserver->registerObserver($local);
$objObserver->registerObserver($sports);
$objObserver->setSportsNews("sportsnews1");
$objObserver->setLocalNews("localnews1");
$objObserver->removeObserver($sports);
$objObserver->setLocalNews("localnews2");
$objObserver->setSportsNews("sportsnews2");
$objObserver->removeObserver($local);
$objObserver->setLocalNews("localnews3");
相关文章推荐
- php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式)
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- 设计模式之行为型模式(责任链、命令、解释器、迭代式、仲裁者、备忘录、观察者、状态、策略、模板方法、访问者)
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- 设计模式之行为模式-命令,迭代器,中介者,观察者,模板方法
- 慕课网----大话PHP设计模式 四(适配器模式,数据对象映射模式,观察者模式)
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- php设计模式专题附源码(解释器模式、工厂方法模式、外观模式、装饰模式、建造者模式)
- php设计模式 Command(命令模式)
- [php]php设计模式 Command(命令模式)
- php设计模式 Observer(观察者模式)
- php设计模式 Command(命令模式)
- Android设计模式系列(4)--SDK源码之模板方法模式
- PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
- php设计模式 Template (模板模式)
- PHP设计模式之观察者模式
- C++实现网络服务器命令模式(设计及模板实现)
- php设计模式 Command(命令模式)
- PHP设计模式:模板Template模式
- [php]php设计模式 Adapter(适配器模式)