php 常用设计模式demo
<?php
//__get()
//__set()当对象中属性不存在时调用该魔术方法
//__call()当对象中方法不存在时
//__callStatic()静态方法
//__string()当对象不能转换成字符串时使用__string()
//__invoke()对象不能直接当成一个函数使用
//工厂模式,是有一个工厂创建类,通过工厂调用:: 工厂方法或者类生成对象,而不是在代码中直接new
//单例模式,一个类只有一个对象,例如要连接数据库使用一次就可以了,使某个类的对象仅允许创建一次
//注册模式,全局共享和交换对象 //单例设计模式
//设计模式讲究对象之间关系的抽象
//单例模式只有自己一个对象
//单例模式应用场景:
//1.应用程序与数据库交互
// 使用单例模式可以避免大量的new操作,每次new操作都会消耗内存资源和系统资源
//2.控制配置信息
//系统中需要有一个类来全局控制某些配置信息
//策略模式
//策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,
//实例:加入一个电商网站,针对男性女性用户要跳转到不同的电商类目,并且所有的广告位展示不同的广告
//可以实现Ioc,依赖导致,控制反转
/**
* 工厂模式例1
*/
interface person{
public function say();
}
class man implements person{
public function say(){
echo "我是男生<br>";
}
}
class woman implements person{
public function say(){
echo "我是女生<br>";
}
}
class simpleFactoty{
static function createman(){
return new man();
}
static function createwoman(){
return new woman();
} }
$man = simpleFactoty::createman();
$man->say();
$woman = simpleFactoty::createwoman();
$woman->say();
/**
* 工厂模式例2
*/
interface transport{ public function go(); } class bike implements transport{ public function go(){ echo "bike跑的慢<br>"; } } class car implements transport{ public function go(){ echo "car开的快<br>"; } } class bus implements transport{ public function go(){ echo "bus每一站都要停<br>"; } } class transFactory{ public static function factory($transport){ switch($transport){ case 'bike': return new bike(); break; case 'car': return new car(); break; case 'bus': return new bus(); break; } } } $transport = transFactory::factory('car');
$transport->go();
/**
* 单例模式例1
*/
class Single {
private $name;//声明一个私有的实例变量
private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
}
static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
if(!self::$instance)
self::$instance = new self();
return self::$instance;
}
public function setname($n){
$this->name = $n;
}
public function getname(){
return $this->name;
}
}
$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning'.'<br>');
echo $oa->getname();//good morning
echo $ob->getname();//good morning /**
* 单例模式例2
*/
class uni{
static private $instance;//创建静态私有的变量保存该类对象
private $config;//参数
private function __construct($config){
$this->config = $config;
echo "我被实例化了";
}
private function __clone(){ }
//提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
static public function getInstance($config){//判断$instance是否是UNI的对象
if(!self::$instance instanceof self){//判断一个对象是否是某个类的实例
self::$instance = new self($config);
}
return self::$instance;
}
public function getName(){
echo $this->config;
} }
$db1 = uni::getInstance(1);
$db1->getName();
echo "<br>";
$db2 = uni::getInstance(4);
$db2->getName();
echo "<br>";
/**
* 单例模式例3
*/ class pzhang{ static private $instance; private $config; private function __construct($config){ $this->config = $config; echo "我被实例化了"; } private function __clone(){ } static public function getInstance($config){ if(!self::$instance instanceof self) self::$instance = new self($config); return self::$instance; } public function getname(){ echo $this->config; } } $adb = pzhang::getInstance(1); $adb->getname();
echo "<br>";
/**
* 策略模式
*/
interface baseAgent{//抽象策略角色
public function do_method();
}
class ConcreteStrategyA implements baseAgent{//具体策略角色
public function do_method(){
echo "do method a";
}
}
class ConcreteStrategyB implements baseAgent{//具体策略角色
public function do_method(){
echo "do method b";
}
}
class ConcreteStrategyC implements baseAgent{//具体策略角色
public function do_method(){
echo "do method b";
}
}
class Question{ // 环境角色
private $__strategy; public function __construct(BaseAgent $baseAgent) {
$this->__strategy = $baseAgent;
}
public function handle_question() {
$this->__strategy->do_method();
}
}
$strategyA = new ConcreteStrategyA();
$question = new Question($strategyA);
$question->handle_question();//输出do method A $strategyB = new ConcreteStrategyB();
$question = new Question($strategyB);
$question->handle_question();//输出do method B $strategyC = new ConcreteStrategyC();
$question = new Question($strategyC);
$question->handle_question();//输出do method C
echo "<br>";
/**
* 策略模式
*/ interface pzhangt{//抽象策略角色 public function say(); } class A implements pzhangt{//具体策略角色 public function say(){ echo "说see you"; } } class B implements pzhangt{ public function say(){ echo "说 good bay"; } } class questiont{ private $test; public function __construct(Pzhangt $pzhangt){ $this->test = $pzhangt; } public function handle(){ $this->test->say(); } } $a = new A(); $res = new questiont($a); $res->handle(); $b = new B(); $res = new questiont($b); $res->handle(); ?>
php 常用设计模式demo的更多相关文章
- PHP常用设计模式,PHP常用设计模式详解,PHP详解设计模式,PHP设计模式
PHP常用设计模式详解 单例模式: php交流群:159789818 特性:单例类只能有一个实例 类内__construct构造函数私有化,防止new实例 类内__clone私有化,防止复制对象 设置 ...
- Android常用设计模式(二)
Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...
- 代码重构 & 常用设计模式
代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1 新建一个方法 ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- javaEE Design Patter(1)初步了解23种常用设计模式
设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...
- PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)
以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...
- C++源码实现:21种常用设计模式
C++源码实现:21种常用设计模式一直以来在设计模式的学习中,都是出现java的源码,这对学习C++的极度不友好.本工程是基于C++实现21种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...
随机推荐
- Tengine(nginx) 搭建Tomcat集群
好久没有更新学习的内容了,就是得强迫自己写点东西 记录自己的学习,才能更好的进步! Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和 ...
- .Net Core Package lose or not match
错误.警告的说明: 示例一: 严重性:警告 代码:MSB3106 说明 :程序集强名称“C:\Users\$(computerName)\.nuget\packages\$(packageName)\ ...
- 【译】第45节---EF6-索引属性
原文:http://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx Entity ...
- 【译】第39节---EF6-数据库命令日志
原文:http://www.entityframeworktutorial.net/entityframework6/database-command-logging.aspx 本节,我们学习如何记录 ...
- 在C#中理解和实现策略模式的绝对入门教程
介绍 本文的目的是理解战略模式的基础知识,并试图了解何时可以使用,并有一个基本的实现,以便更好地理解.在现实世界的应用中,这是无法实施战略模式的,所采用的例子也远没有实际可行.这篇文章的想法只是为了说 ...
- QT移植无法启动 This application failed to start because it could not find or load the QT platform
QT配置好在自己机器上可以运行,但在别人机器上一直弹出 "This application failed to start because it could not find or load ...
- hdu 5795 A Simple Nim 博弈sg函数
A Simple Nim Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pro ...
- hrbust 2080链表 【贪心】
仔细看题想想就是个贪心题,两个sort就可以解决了 #include<stdio.h> #include<string.h> #include<math.h> #i ...
- 搞定'express' 不是内部或外部命令,也不是可运行的程序或批处理文件
1 -- 官方下nodejs,一路next完成, node -v 没问题 可以检测到版本号,node环境ok~ 2-- 本地 安装express :npm install express -g 检测 ...
- file类中,命令记录
file的长度>>4096当前盘符总空间字节数>>>151200460800当前盘符的可用空间字节数>>>143769821184 long a = f ...