设计模式
西直门三太子
知是行之始,行是知之成
展开
-
Go常用设计模式
代理模式对被代理的对象进行访问控制,把主机看做一个类,那么路由器就是代理者,代理者可以决定是否对其开放网络,和获取主机网络的具体信息。工厂方法 提供创建实例的方法,由外部决定是否创建,或者创建的(规格),适用于多规格的产品,比较灵活。主要是对算法(策略)的封装,根据不同场景使用不同的策略。等我感觉要死了再吃,就是我确定要用到,才会去实例化。将共同点抽离生成模板类,可变点强制子类去实现。不管什么方式,都应该提供一个最佳配置的生成。和简单工厂的区别在于其返回的是接口类型。饿的要死就先吃,上来就给你初始化。原创 2023-04-30 01:11:30 · 770 阅读 · 0 评论 -
桥接模式详解
桥接模式由:实现化角色 + 具体实现化角色 + 抽象化角色 + 具体抽象化角色。当存在多个维度的变化,使用桥接模式来实现动态耦合,减少静态依赖。原创 2022-10-04 16:23:11 · 108 阅读 · 0 评论 -
适配器模式详解
意义在于让原本不能一起工作的类一起工作。由:待适配 + 内部接口 + 适配器。原创 2022-10-03 20:02:27 · 106 阅读 · 0 评论 -
工厂模式详细解
咋和工厂方法这么像呢,不同在于其工厂类能创建一系列相关的产品。由:抽象工厂 + 工厂类 + 抽象产品 + 具体产品。由:抽象工厂 + 工厂类 + 抽象产品 + 具体产品。缺点:违反开闭原则,增加新的产品需要修改工厂类。由工厂类 + 抽象产品 + 具体产品类构成。优点:和简单工厂比较,符合开闭原则。缺点:产品的增加,工厂也要跟着增加。向工厂类输入参数创建指定的产品。工厂模式可以细分为三种。原创 2022-10-01 16:35:08 · 163 阅读 · 0 评论 -
访问者模式
<?php/** * 访问者双要素 * 1.元素 * 2.访问者 * 元素负责存储数据,提供接口访问 * 访问者通过元素暴露的接口获取信息 */abstract class Element{ public function accept(Visitor $visitor){ $visitor->visit($this); }}interface Visitor{ public function visit(Element $elemen原创 2020-09-28 13:45:04 · 67 阅读 · 0 评论 -
模板模式
/** * 抽象模板模式 * 继承复用 */abstract class Template{ public function isOk($name,$password){ return true; } public abstract function handle($name); public abstract function error($name); public function login($name,$password){原创 2020-09-24 16:06:40 · 47 阅读 · 0 评论 -
策略模式
<?php/** * 策略三要素 * 1.环境 * 2.抽象策略 * 3.具体策略 *//** * 抽象策略类 * Interface IPoly */interface IPoly{ public function buy($money);}/** * 环境 * Class Env */Class Env{ protected $poly; public function setPoly(Ipoly $poly){ .原创 2020-09-23 18:02:02 · 57 阅读 · 0 评论 -
观察者模式
<?php/** * 观察者模式 * 通常来说,三要素 * 1.被观察者(目标) * 2.事件对象(参数) * 3.观察者(处理事件) */interface ITarget{ public function notify(Param $param);}interface IObserve{ public function update(Param $param);}/** * 目标类 * Class Target */class Target i.原创 2020-09-21 17:06:52 · 45 阅读 · 0 评论 -
观察者模式
<?php/** * 观察者模式 * 通常来说,三要素 * 1.被观察者(目标) * 2.事件对象(参数) * 3.观察者(处理事件) */interface ITarget{ public function notify(Param $param);}interface IObserve{ public function update(Param $param);}/** * 目标类 * Class Target */class Target i.原创 2020-09-18 10:14:07 · 85 阅读 · 0 评论 -
备忘录模式
<?php/*** 备忘录三要素:* 原发器负责生成备忘录,解析备忘录* 备忘录负责维护数据* 负责人负责维护备忘录* 备忘录优点:提供状态恢复机制* 缺点:存的备忘录对象过多,消耗系统资源*//*** 原发器* Class Handle*/class Handle{public $x;public $y;public function __construct($x,$y){$this->x = $x;$this->y = $y;}pub.原创 2020-09-17 17:29:20 · 144 阅读 · 0 评论 -
中介者模式
<?php/** * 加强版的门面模式 * 将网状关系处理成中心点模式 * 假设有这么一个需求: * 点击按钮提交表单,表单就填写一个名字 * 列表页要增加一个名字 * 统计栏要加1 **///没引入中介者模式之前的 网状关系class Button{ protected $count; protected $label; public function __construct() { $this->count = ne.原创 2020-09-17 15:26:43 · 101 阅读 · 0 评论 -
迭代器模式
<?php/** * 江湖人称迭代器模式 * 迭代器模式将遍历和数据分开,遍历不需要了解细节(你是数组呢,还是链表呢) * 由于不需要了解细节,可以为不同的数据结构提供相同的遍历接口 * 可以为同一结构提供不同的遍历,列如逆序 * Class product */abstract class product{ protected $product = []; public function __construct(array $product) { .原创 2020-09-16 19:41:10 · 74 阅读 · 0 评论 -
KISS原则,YAGIN原则,DRY原则
一.如何实现KISS原则(简单)1.不使用同事看不懂的技术编写代码2.使用现有成熟的扩展,而不重复造轮子3.不过度为了性能牺牲代码可读性二.YAGIN原则(不需要)1.不要设计和当前无关的设计2.不要去编写当前使用不到的功能三.DRY原则(不重复)1.实现逻辑重复,并不一定违反原则(在不同语义下,实现逻辑重复,并不违反原则。但是可以优化,提取公共部分,供不同语义调用。提高代码复用)2.语义重复(导致调用者不知道调用那个。相同功能的不同语义导致后期难维护)3.代码执行重原创 2020-08-27 17:50:40 · 401 阅读 · 0 评论 -
接口隔离原则,控制反转,依赖注入,依赖倒置
一.接口隔离原则1.接口隔离原则为接口单一原则提供了判断标准。如果调用者只是用了接口的部分功能(a,b,c 三个方法。系统只用到了a,b),那么说明这个接口不够单一2.接口功能也要单一(如果a方法除了负责加还负责减乘除取余等等,功能不够单一)3.调用者依赖...原创 2020-08-27 15:28:36 · 206 阅读 · 0 评论 -
对扩展开放对修改关闭,里氏替换原则和多肽区别,
一.如何区别是扩展还是修改如果更改需求和增加功能是一定会修改代码的,一般认为在低颗粒度下的修改为扩展,在大的颗粒度下认为是修改二.里氏替换原则和多肽的区别1.里氏替换原则要求子类不能违背父类的功能(父类做加法,子类做减法)2.里氏替换原则要求子类不能违背父类的输入参数,输出参数,抛出异常等约定3.里氏替换原则要求子类不能违背父类注释中的特殊说明。(父类要求不能透支,子类透支)...原创 2020-08-25 17:40:22 · 133 阅读 · 0 评论 -
单一原则
一.如何判断类的职责是否足够单一:在不同的应用场景,不同的需求阶段,对于类的职责是否单一,有不同的判断标准假设user类包含地址信息,且地址信息只负责展示,那么user类可以包含地址相关属性。如果需求变动,用户地址为商品寄送地址,那么user应拆分为user 和 address 类的,如果需求变动,要求同一用户账号能够登陆多个app,那么user 应把登陆相关信息拆分出来(应为每个app的昵称等其它信息是可以不同的)二.如何判断一个类是否足够单一1.属性,和方法,方法代码数量适中(太多不易读,不易原创 2020-08-25 13:41:29 · 155 阅读 · 0 评论 -
好的代码通常具有的特征
1.可维护性在原有设计下能快速 修改或添加代码,极低概率引入新的bug2.可读性符合编码规范,命名知名见意。有注释,模块划分清晰,函数长度适中3.可扩展性在不改动原有代码或少量修改前提下,通过扩展增加新的代码。通俗说就是预留位置4.灵活性易扩展,易复用,易用5.简洁性代码简单,逻辑清晰,易读,易维护6.可复用性避免写重复代码7.可测试性易于单元测试...原创 2020-08-22 19:55:34 · 4878 阅读 · 0 评论