PHP类的设计模式
- 单例模式
<?php
class mysingle
{
private static $myinstance =null;
private function __construct()
{
}
private function __clone()
{ }
public static function createobject()
{
if (self::$myinstance==null)
{
self::$myinstance = new self();
}
return self::$myinstance;
}
}
$thesingle = mysingle::createobject();
$anothersingle = mysingle::createobject();
echo ($thesingle===$anothersingle);
?>
输出结果:
1
说明两个对象完全一致
- 观察者模式
被观察者(dingdaguo)做出某种行为(drink_cola())时,触发监控者(coach)的做出一些反应(persuade)
<?php
class dingdaguo
{
protected $observers = [];
public function addobserver($myobserver)
{
$this->observers[] = $myobserver;
}
public function drink_cola()
{
foreach($this->observers as $observer)
{
$observer->persuade();
}
}
public function delobsrver($observer)
{
$index = array_search($observer,$this->observers,);
$this->observers=array_slice($this->observers,,$index);
}
} class coach
{
public function __construct($name)
{
$this->name = $name;
} public function persuade()
{
echo $this->name."说:别喝可乐了,都是甜的东西".PHP_EOL;
}
}
$cpc = new coach("陈培昌");
$cj = new coach("程劲");
$dy = new dingdaguo();
$dy->addobserver($cpc);
$dy->addobserver($cj);
$dy->drink_cola();
echo "删除其中一个对象".PHP_EOL;
$dy->delobsrver($cj);
$dy->drink_cola();
输出结果:
陈培昌说:别喝可乐了,都是甜的东西
程劲说:别喝可乐了,都是甜的东西
删除其中一个对象
陈培昌说:别喝可乐了,都是甜的东西
- 适配器
实现接口的过程中,所有类都按照一种方式实现接口
<?php
interface martial_trainning
{
public function welcomeword();
public function braziljudo();
public function muaythai();
}
class xxd
{
public function welcomeword()
{
echo "欢迎来到必图训练".PHP_EOL;
}
}
class cj
{
public function braziljudo()
{
echo "我是小烤肠,来跟我一起学巴西柔术吧".PHP_EOL;
}
} class cpc implements martial_trainning
{
protected $myxxd = null;
protected $mycj = null;
public function __construct($xxd,$cj)
{
$this->myxxd = $xxd;
$this->mycj = $cj;
}
public function welcomeword()
{
// TODO: Implement welcomeword() method.
$this->myxxd->welcomeword();
}
public function braziljudo()
{
// TODO: Implement braziljudo() method.
$this->mycj->braziljudo();
}
public function muaythai()
{
echo "我是小松鼠,跟我一起练习泰拳吧".PHP_EOL;
}
} $cj = new cj();
$xxd = new xxd();
$cpc = new cpc($xxd,$cj);
$cpc->braziljudo();
$cpc->welcomeword();
$cpc->muaythai();
?>
输出结果:
我是小烤肠,来跟我一起学巴西柔术吧
欢迎来到必图训练
我是小松鼠,跟我一起练习泰拳吧
- 策略模式
通过可以预测的参数传入,来决定调用哪个类的实现
<?php
interface martial_trainning
{
public function hoaring();
}
class xxd implements martial_trainning
{
public function hoaring()
{
echo "诶斯~诶斯~".PHP_EOL;
}
}
class cj implements martial_trainning
{
public function hoaring()
{
echo "诶~嘿嘿".PHP_EOL;
}
}
class cpc implements martial_trainning
{
public function hoaring()
{
echo "嗷儿喂~嗷儿喂~";
}
}
class mycoach
{
protected $myobject = null;
public function __construct($whichobject)
{
$this->myobject = $whichobject;
}
public function hoaring()
{
$this->myobject->hoaring();
}
}
$cpc = new cpc();
$mycoach = new mycoach($cpc);
$mycoach->hoaring();
echo PHP_EOL."===========换了一个类=============".PHP_EOL;
$cj = new cj();
$mycoach = new mycoach($cj);
$mycoach->hoaring();
?>
输出结果:
嗷儿喂~嗷儿喂~
===========换了一个类=============
诶~嘿嘿
PHP类的设计模式的更多相关文章
- 一种JavaScript 类的设计模式
一种JavaScript 类的设计模式尽管前面介绍了如何定义一个类,如何初始化一个类的实例,但既可以在function定义的函数体中添加成员,又可以用prototype 定义类的成员,代码显的很混乱, ...
- 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...
- 游戏设计模式——C++单例类
前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...
- 设计模式——抽象工厂(Abstract Factory)
Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里 - - ...
- IOS设计模式第一篇之MVC
设计模式的好处:我们可以写出容易理解,重用度很高的代码.降低代码的耦合度,符合软件工程的思想. 设计模式主要分为三类:创造型的:单例和抽象工厂.结构类型的: MVC Decorator, Adapt ...
- (转)C++——std::string类的引用计数
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...
- Java设计模式之策略设计模式
1.什么是-策略设计模式 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Ha ...
- python设计模式浅析
今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...
- 结合JDK源码看设计模式——单例模式
定义: 保证一个类仅有一个实例,并提供一个全局访问点 适用场景: 确保任何情况下这个对象只有一个实例 详解: 私有构造器 单利模式中的线程安全+延时加载 序列化和反序列化安全, 防止反射攻击 结合JD ...
随机推荐
- Gym - 100989 L / M 【dfs / dp】
题目链接:http://codeforces.com/gym/100989/problem/L / http://codeforces.com/gym/100989/problem/M 题目大意:给定 ...
- [Agc036D]Do Not Duplicate_链表_贪心_数论
Do Not Duplicate 题目链接:https://atcoder.jp/contests/agc036/tasks/agc036_b 题解: 首先最后肯定至多只有$n$个数. 我们想处理出来 ...
- MySQL中的数据类型 [数值型、字符串型、时间日期型]
MySQL中的数据类型 [数值型.字符串型.时间日期型] MySQL中各数据类型 1. 数值类型(整型) 类型 数据大小 类型 (无符号:unsigned) 数据大小 存储空间 tinyint -12 ...
- springboot 论坛项目
项目演示地址:http://www.mawen.co/ 快速搭建sprintboot项目 运行第一个springboot项目 leaf package hello; import org.spring ...
- X86逆向8:向程序中插入新区段
本节课我们不去破解程序,本节课学习给应用程序插入一些代码片段,这里我就插入一个弹窗喽,当然你也可以插入一段恶意代码,让使用的人中招, 这里有很多原理性的东西我就不多罗嗦了毕竟是新手入门教程,如果想去了 ...
- hdu 1215 求约数和 唯一分解定理的基本运用
http://acm.hdu.edu.cn/showproblem.php?pid=1215 题意:求解小于n的所有因子和 利用数论的唯一分解定理. 若n = p1^e1 * p2^e2 * ……*p ...
- Autofac通过配置的方式
autofac是比较简单易用的IOC容器.下面我们展示如何通过json配置文件,来进行控制反转. 需要用到以下程序集.可以通过nugget分别安装 Microsoft.Extensions.Confi ...
- Docker ASPNetCore https 四步教你搭建一个网站
序 本教程需要有自己已经申请好的证书 ,没有证书请参照官方教程. Docker 就不多说了,咱只要知道怎么用先. 环境 core:asp net core 2.2 开发机:win10 LTS 服务器: ...
- 【原创】大叔经验分享(71)docker容器中使用jvm工具
java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...
- centos7配置rsync+inotify数据实时共享
关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...