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种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...
随机推荐
- imx6ul linux4.1.15 LED驱动配置及heartbeat源码分析【转】
本文转载自:https://blog.csdn.net/u010444107/article/details/78328807 1)查看内核配置wujun@wj-vBox:~/freescale/li ...
- Mysql的timestamp字段默认值设置问题
参考: https://www.cnblogs.com/mxwz/p/7520309.html https://www.jb51.net/article/50878.htm https://blog. ...
- HDU 3333 Turing Tree(树状数组/主席树)
题意 给定一个长度为 \(n\) 的序列,\(m\) 个查询,每次查询区间 \([L,R]\) 范围内不同元素的和. \(1\leq T \leq 10\) \(1 \leq n\leq 300 ...
- Java基础 【自动装箱和拆箱、面试题】
JDK 1.5 (以后的版本)的新特性自动装箱和拆箱 1. 自动装箱:把基本类型转换为包装类类型 int a =10; Integer i = new Integer(a); Integer valu ...
- 【C#】异步的用法
1. C#5.0 加入了async, await关键字. async是在声明异步方法时使用的修饰符, 声明放在返回值之前即可,await表达式则负责消费异步操作, 不能出现在catch或finally ...
- Linux 下上手 STC89C52RC
第一次接触单片机,自然选择了简单的51单片机.然而我的操作系统是 Linux .在 Windows 下上手51似乎很容易.但是 Linux 上搭建 51 开发环境不是很顺. 那么谈谈 Linux 我如 ...
- ASP.NET —— Web Pages
为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...
- Excel 导出通用类
public class ExportToExcelHelper { public static void ExportExcel(DataTable dt) { try { //创建一个工作簿 IW ...
- re模块与subprocess模块介绍
一:re模块 处理正则表达式的模块,正则表达式就是一些带有特殊含义的符号或者符号的组合. 作用:对字符串进行过滤,在一堆字符串中找到你所关心的内容,你就需要告诉计算机你的过滤的 规则是什么 ...
- 【一】php 基础知识
1 php标记,<?php php代码 ?> 2 注释:代码的解释和说明 多行注释 /**/ 单行注释 //.# 3“.”连接符 echo "hello".date(& ...