- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了PHP设计模式之中介者模式(Mediator Pattern)。分享给大家供大家参考,具体如下:
咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停者模式,它是一种对象行为型模式.
我们先来看用户与用户直接聊天的设计方案.
在这个方案设计的过程中,我们可以发挥想象,用户对象之间存在很强的关联性,将导致系统出现如下问题:
然而,在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,但是,对于一个模块来说,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是我们使用中介者模式的动机.
来看下中介者模式包含的角色:
再来看下图片感受下:
来看一个完整的实例:
代码实例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
<?php
class
CD {
public
$band
=
''
;
public
$title
=
''
;
protected
$_mediator
;
public
function
__construct(MusicContainerMediator
$mediator
= NULL) {
$this
->_mediator =
$mediator
;
}
public
function
save() {
//具体实现待定
var_dump(
$this
);
}
public
function
changeBandName(
$bandname
) {
if
( !
is_null
(
$this
->_mediator)) {
$this
->_mediator->change(
$this
,
array
(
"band"
=>
$bandname
));
}
$this
->band =
$bandname
;
$this
->save();
}
}
//MP3Archive类
class
MP3Archive {
protected
$_mediator
;
public
function
__construct(MusicContainerMediator
$mediator
= NULL) {
$this
->_mediator =
$mediator
;
}
public
function
save() {
//具体实现待定
var_dump(
$this
);
}
public
function
changeBandName(
$bandname
) {
if
( !
is_null
(
$this
->_mediator)) {
$this
->_mediator->change(
$this
,
array
(
"band"
=>
$bandname
));
}
$this
->band =
$bandname
;
$this
->save();
}
}
//中介者类
class
MusicContainerMediator {
protected
$_containers
=
array
();
public
function
__construct() {
$this
->_containers[] =
"CD"
;
$this
->_containers[] =
"MP3Archive"
;
}
public
function
change(
$originalObject
,
$newValue
) {
$title
=
$originalObject
->title;
$band
=
$originalObject
->band;
foreach
(
$this
->_containers
as
$container
) {
if
( ! (
$originalObject
instanceof
$container
)) {
$object
=
new
$container
;
$object
->title =
$title
;
$object
->band =
$band
;
foreach
(
$newValue
as
$key
=>
$val
) {
$object
->
$key
=
$val
;
}
$object
->save();
}
}
}
}
//测试实例
$titleFromDB
=
"Waste of a Rib"
;
$bandFromDB
=
"Never Again"
;
$mediator
=
new
MusicContainerMediator();
$cd
=
new
CD(
$mediator
);
$cd
->title =
$titleFromDB
;
$cd
->band =
$bandFromDB
;
$cd
->changeBandName(
"Maybe Once More"
);
|
运行结果:
object(MP3Archive)#3 (3) { ["_mediator":protected]=> NULL ["title"]=> string(14) "Waste of a Rib" ["band"]=> string(15) "Maybe Once More" } object(CD)#2 (3) { ["band"]=> string(15) "Maybe Once More" ["title"]=> string(14) "Waste of a Rib" ["_mediator":protected]=> object(MusicContainerMediator)#1 (1) { ["_containers":protected]=> array(2) { [0]=> string(2) "CD" [1]=> string(10) "MP3Archive" } } } 。
还有个实例,一起看下吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
//抽象同事类,家教
abstract
class
Tutor{
protected
$message
;
//个人信息
protected
$mediator
;
//为家教服务的中介机构
function
__construct(
$message
,Mediator
$mediator
){
$this
->message =
$message
;
$this
->mediator =
$mediator
;
}
//获取个人信息
function
getMessage(){
return
$this
->message;
}
//找学生
abstract
function
findStudent();
}
//具体同事类,大学生家教
class
UndergraduateTutor
extends
Tutor{
//家教类型
public
$type
=
"UndergraduateTutor"
;
function
__construct(
$message
,Mediator
$mediator
){
parent::__construct(
$message
,
$mediator
);
}
//找学生,让中介机构代为寻找
function
findStudent(){
$this
->mediator->matchStudent(
$this
);
}
}
//具体同事类,高中生家教
class
SeniorStudentTutor
extends
Tutor{
//家教类型
public
$type
=
"SeniorStudentTutor"
;
function
__construct(
$message
,Mediator
$mediator
){
parent::__construct(
$message
,
$mediator
);
}
//找学生,让中介机构代为寻找
function
findStudent(){
$this
->mediator->matchStudent(
$this
);
}
}
//具体同事类,初中生家教
class
MiddleStudentTutor
extends
Tutor{
//家教类型
public
$type
=
"MiddleStudentTutor"
;
function
__construct(
$message
,Mediator
$mediator
){
parent::__construct(
$message
,
$mediator
);
}
//找学生,让中介机构代为寻找
function
findStudent(){
$this
->mediator->matchStudent(
$this
);
}
}
//抽象中介类
abstract
class
AbstractMediator{
abstract
function
matchStudent(Tutor
$tutor
);
}
//具体中介类,为家教匹配合适的学生
class
Mediator
extends
AbstractMediator{
//定义其服务的所有家教,不在范围内的不服务
private
$serveObject
=
array
(
"UndergraduateTutor"
,
"SeniorStudentTutor"
,
"MiddleStudentTutor"
);
//匹配学生
function
matchStudent(Tutor
$tutor
){
for
(
$i
=0;
$i
<
count
(
$this
->serveObject);
$i
++){
if
(
$tutor
->type ==
$this
->serveObject[
$i
]){
$message
=
$tutor
->getMessage();
echo
"该家教个人信息为"
.print_r(
$message
).
"<br/>将为其匹配合适的学生"
;
break
;
}
}
if
(
$i
>=
count
(
$this
->serveObject)){
echo
"该家教不在我中介机构服务范围内"
;
}
}
}
//测试
$mediator
=
new
Mediator();
$undergraduateTutor
=
new
UndergraduateTutor(
array
(
"name"
=>
"张三"
,
"age"
=>22),
$mediator
);
$undergraduateTutor
->findStudent();
//结果:该家教个人信息为 Array ( [name] => 张三 [age] => 22 ),将为其匹配合适的学生
|
好啦,本次记录就到这里了.
希望本文所述对大家PHP程序设计有所帮助.
原文链接:https://blog.csdn.net/luyaran/article/details/82801998 。
最后此篇关于PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解的文章就讲到这里了,如果你想了解更多关于PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Hive —— 入门 Hive介绍 Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一
HBase —— 入门 HBase介绍 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”
零:前端目前形势 前端的发展史 HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) ->
在本教程中,您将了解在计算机上运行 JavaScript 的不同方法。 JavaScript 是一种流行的编程语言,具有广泛的应用程序。 JavaScript 以前主要用于使网页具有交
我曾经是一个对编程一窍不通的小白,但因为对互联网世界的好奇心和求知欲的驱使,我踏入了编程的殿堂。在学习的过程中,我发现了一门神奇的编程语言——Python。Python有着简洁、易读的语法,让初学者能
嗨,亲爱的读者们! 今天我要给大家分享一些关于Python爬虫的小案例。你是否曾为了获取特定网页上的数据而烦恼过?或者是否好奇如何从网页中提取信息以供自己使用?那么,这篇文章将会给你一些启示和灵感。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想创建一个像https://apprtc.appspot.com/?r=04188292这样的应用程序。我对 webrtc 了解一点,但无法掌握 google app-engine。如何为 java
我刚刚开始使用 Python 并编写了一个简单的周边程序。但是,每当我在终端中键入 python perimeter.py 时,都会收到以下错误,我不知道如何解决。 >>> python perime
Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了
创建发布web项目 具体步骤: 1.在开发工具中创建一个dynamic web project helloword 2.在webContent中创建index.html文件 3.发布web应用到
如果你在 Ubuntu 上使用终端的时间很长,你可能会希望调整终端的字体和大小以获取一种良好的体验。 更改字体是一种最简单但最直观的 Linux 的终端自定义 的方法。让我
1. 前言 ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件。现在 SFS3 系统 (校园自由软件交流网学务系统) 计划的
我对 neo4j 完全陌生,我很抱歉提出这样一个基本问题。我已经安装了neo4j,我正在使用shell“localhost:7474/webadmin/#/console/” 我正在寻找一个很好的例子
我正在阅读 ios 4 的核心音频,目的是构建一个小测试应用程序。 在这一点上,我对所有 api 的研究感到非常困惑。理想情况下,我想知道如何从两个 mp3 中提取一些样本到数组中。 然后在回调循环中
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是无关紧要的,因
我下载了 GNUStep并安装了它,但是我不确定在哪里可以找到 IDE。有谁知道什么程序可以用作 GNUStep IDE/从哪里获取它们?否则,有没有人知道有关如何创建和编译基本 GNUStep 程序
我正在尝试开始使用 Apache Solr,但有些事情我不清楚。通读tutorial ,我已经设置了一个正在运行的 Solr 实例。我感到困惑的是 Solr 的所有配置(架构等)都是 XML 格式的。
请问有没有关于如何开始使用 BruTile 的文档? 我目前正在使用 SharpMap,我需要预缓存切片以加快进程 最佳答案 我今天正在研究这个:)Mapsui项目site严重依赖 SharpMap
尽我所能,我无法让 CEDET 做任何事情。 Emacs 24.3。我下载了最新的 CEDET 快照。我从他的底部(不是这样)Gentle Introduction 中获取了 Alex Ott 的设置
我是一名优秀的程序员,十分优秀!