设计模式一详解

2024-03-29 07:20
文章标签 设计模式 详解

本文主要是介绍设计模式一详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、观察者模式

  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();

这篇关于设计模式一详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857968

相关文章

【再探】设计模式— 工厂方法、单例及原型模式

创建型设计模式是处理对象创建的设计模式,主要特点是“将对象的创建与业务代码分离”。一共有五种:工厂方法模式、单例模式、原型模式、抽象工厂模式及建造者模式。 1 单例模式 需求: 在整个系统中只需要一个实例。管理共享资源,例如数据库连接、配置文件读取等,可以减少资源消耗,提高性能。 1.1 单例模式介绍 确保某个类只有一个实例,自行实例化并且向整个系统提供这个实例。 图 单例模式U

设计模式- 迭代器模式(Iterator Pattern)结构|原理|优缺点|场景|示例

设计模式(分类)        设计模式(六大原则)        创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式     结构型(7种)        适配器模式        装饰器模式        代理模式

CUDA架构介绍与设计模式解析

文章目录 **CUDA**架构介绍与设计模式解析**1** CUDA 介绍CUDA发展历程CUDA主要特性CUDA系统架构CUDA应用场景编程语言支持CUDA计算过程线程层次存储层次 **2** CUDA 系统架构分层架构并行计算模式生产-消费者模式工作池模式异步编程模式 **3** CUDA 中的设计模式工厂模式策略模式观察者模式适配者模式迭代器模式 CUDA架构介绍与设计

Qt QLineEdit详解

1.简介 QLineEdit是一个单行文本编辑器。 行编辑允许用户使用一组有用的编辑功能输入和编辑单行纯文本,包括撤消和重做、剪切和粘贴以及拖放。 通过更改行编辑的echoMode,它也可以用作“只写”字段,用于密码等输入。 文本的长度可以限制为maxLength,文本可以使用validator或inputMask进行任意约束,也可以同时使用这两种方法。在同一行编辑的validator和inpu

关于网线Rs232与Rj45转接详解,从原理带你做一根标准线出来

先说结论: ==================================== 一、原理: 串口常用 Rs232 Rs422/485规则 而RS232中: 常用5~12V供电,电压较高 此处以DB9(9针公母头)为例: 公头Tx数据,母头Rx数据。反之亦然。 以此实现串口的数据传输。 常见的实物DB9如下: 二、接下来我们开始制作线 1.既然Rs232

apache配置文件,httpd.conf详解

Apache的主配置文件:/etc/httpd/conf/httpd.conf 默认站点主目录:/var/www/html/ Apache服务器的配置信息全部存储在主配置文件/etc/httpd/conf/httpd.conf中,这个文件中的内容非常多,用wc命令统计一共有1009行,其中大部分是以#开头的注释行。 [root@justin ~]# wc -l /etc/httpd/conf/h

Windows10安装MySQL教程详解

MySQL简介 MySQL是一个关系数据库管理系统,由瑞典MySQL AB公司开发,属于oracle旗下产品。MySQL是最流行的关系数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。 MySQL安装 MySQL官网下载链接:MySQL :: MySQL Downl

【SAM导出】使用torch.onnx.export将pth格式导出为onnx格式(Pytorch代码详解)

一般情况下,我们保存模型的格式都是pth的,最近根据一个项目需求,需要把pth格式转换为onnx格式,方便后面的调取,故此学习理解了一下,记录将SAM模型导出为onnx的过程。 SAM系列篇:   【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Image Encoder   【技术追踪】SAM(Segment Anything Model)代码解析

Java中List<T>、List<?>、List<Object>、List<E>、List<U>的区别详解

前言 在Java中,泛型为程序员提供了编译时类型安全检查,减少了强制类型转换的需求,并提高了代码的可读性和重用性。List<T>、List<?>、List<Object>、List<E>、List<U>这些不同的泛型列表声明各有其特性和用途,下面将详细解析它们之间的区别。 List<T> 定义:List<T>是最常见的泛型列表声明方式,其中T代表类型参数(Type Parameter)。这是

5分钟帮你完全搞定!!![动画+注释详解] 数据结构 - 选择排序

目录  一、选择排序算法的实现 1. 基本思想 二、排序过程 1. 动图分析  2. 实例分析 3. 代码解释 选择排序的优化方案  1. 实例分析 2. 代码解释 选择排序的时间复杂度和空间复杂度  时间复杂度 空间复杂度 总结  一、选择排序算法的实现 1. 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部