当前位置: 首页 > news >正文

设计模式一详解

一、观察者模式

  1. 当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新

  2. 场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是藕合的,侵入式的,增加新的逻辑需要修改事件主体的代码

  3. 观察者模式实现了低耦合,非侵入式的通知与更新机制

<?php
​
interface watcher{public function update();
}
​
abstract class watch{private $watchArr = array();public function addWatchArr(watcher $watcher){$this->watchArr[] = $watcher;}public function notify(){foreach($this->watchArr as $value){$value->update();}}
}
​
class watcher1 implements watcher{public function update(){echo "update watcher1";}
}
​
class watcher2 implements watcher{public function update(){echo "update watcher2";}
}
​
​
class main extends watch{public function test(){echo "update1";$watcher1 = new watcher1();$watcher2 = new watcher2();$this->addWatchArr($watcher1);$this->addWatchArr($watcher2);$this->notify();
​}
}
​
$main = new main();
$main->test();

上面的interface{} 为每个实例提供了统一的方法,那么抽象方法提供了添加实例以及统一遍历实例的方法。

二、适配器模式

  1. 适配器模式,可以将截然不同的函数接口封装成统一的API

  2. 实际应用举例,PHP 的数据库操作有mysql,mysqli 等,可以通过适配器模式统一成一致

interface database{public function connect();public function query();
​public function delete();
}
​
class mysql implements database{public function connect(){
​}
​public function query(){
​}
​public function delete(){}
}

三、策略模式

  1. 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式

  2. 使用策略模式可以实现IOC,依赖倒置、控制反转

<?php

interface advertise{public function show();
}
​
​
class man implements advertise{ public function show(){echo "显示man";}
}
​
​
class woman implements advertise{public function show(){echo "显示woman";}
}
​
​
class showindex{private $advertise;public function addObject(advertise $advertise){$this->advertise = $advertise;}public function index(){$this->advertise->show();}
}
​
​
$showindex = new showindex();
$women = new woman();
$showindex->addObject($women);
$showindex->index();

四、装饰器模式

  1. 装饰器模式,可以动态地添加修改类的功能

  2. 一个类提供了一项功能,如果修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法

  3. 使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性

interface drawInterface{public function beforeDraw();public function afterDraw();
}
​
class Draw{
​private $addDraw = array();public function addDrwa(drawInterface $draw){$this->addDraw[] = $draw;}private function beforeDraw(){foreach($this->addDraw as $row){$row->beforeDraw();}}
​private function afterDraw(){$t = array_reverse($this->addDraw);foreach($t as $row){$row->afterDraw();}}public function show(){$this->beforeDraw();echo "*";$this->afterDraw();}
}
​
​
class A implements drawInterface{public function beforeDraw(){echo "<h1>";}public function afterDraw(){echo "</h1>";}
}
​
class B implements drawInterface{public function beforeDraw(){echo "<h2>";}public function afterDraw(){echo "</h2>";} 
}
​
$draw = new Draw();
$draw->addDrwa(new A());
$draw->addDrwa(new B());
$draw->show();

相关文章:

  • MongoDB副本集环境搭建(以单机Windows为例)
  • Python从原Excel表中抽出数据存入同一文件的新的Sheet(附源码)
  • 魔改一个过游戏保护的CE
  • 亚信安全荣获2023年度5G创新应用评优活动两项大奖
  • 深入理解 JavaScript 中的变量声明:var、let 和 const
  • QT 最近使用的项目配置文件
  • 数据结构——优先级队列及多服务台模拟系统的实现
  • 【面试专题】MySQL
  • 网络基础二补充——json与http协议
  • 网络编程的学习1
  • 火车头通过关键词采集文章的原理
  • Linux中断管理:(一)中断号的映射
  • JavaScript高级 —— 学习(四)
  • 「MySQL」索引事务
  • electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)
  • eclipse(luna)创建web工程
  • HTML-表单
  • HTTP 简介
  • JAVA_NIO系列——Channel和Buffer详解
  • js递归,无限分级树形折叠菜单
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Spark RDD学习: aggregate函数
  • 读懂package.json -- 依赖管理
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术发展面试
  • 入门级的git使用指北
  • 入手阿里云新服务器的部署NODE
  • 使用parted解决大于2T的磁盘分区
  • 微信公众号开发小记——5.python微信红包
  • 用element的upload组件实现多图片上传和压缩
  • 2017年360最后一道编程题
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • !!java web学习笔记(一到五)
  • #1015 : KMP算法
  • #include<初见C语言之指针(5)>
  • #WEB前端(HTML属性)
  • #宝哥教你#查看jquery绑定的事件函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)WCF的Binding模型
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (新)网络工程师考点串讲与真题详解
  • (一一四)第九章编程练习
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .ui文件相关
  • @RequestMapping-占位符映射
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 数据结构 - C++]红黑树RBTree
  • [Codeforces] probabilities (R1600) Part.1
  • [Deep Learning] 神经网络基础
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件