2/24 设计模式之访问者设计模式 Visitor Pattern

类别:行为型设计模式

目的:不改变类的定义的约束下,为类的对象应用/添加新的行为

典型场景

现存一系列对象,比如由很多html标签对象组成了一个html页面,这里拿几个html标签举例

标签 当前状态 目标状态
a <a href=“#”>link</a> 添加class=“underlinea"
p <p>this is a paragraph</p> 添加style=“font: bold"
h1 <h1>new title</h1> 添加id=“h1-highlight"

当前代码状态如下,注意需要修改的部分

Read more   2020/2/27 posted in  设计模式 JAVA

1/24 设计模式之策略设计模式 Strategy Pattern

类别:行为型设计模式

目的:把同类的代码进行单独封装、使得需要使用这部分代码的用户可以按需使用

典型场景

对用户上传的图片应用不同的压缩算法和滤镜

压缩算法:

  1. jpeg格式
  2. png格式

滤镜:

  1. blackAndWhite滤镜
  2. backgroundBlur滤镜

硬编码

public class HardCode {
    public static void main(String[] args) {
        var fileName = "test.jpg";
        var compressor = "jpeg";
        var filter = "blackAndWhite";

        handleUpload(fileName, compressor, filter);
    }

    public static void handleUpload(String fileName, String compressor, String filter)
    {
        if (compressor.equals("jpeg")) {
            System.out.println("应用jpeg压缩算法...");
        } else if (compressor.equals("png")) {
            System.out.println("应用png压缩算法...");
        }

        if (filter.equals("blackAndWhite")) {
            System.out.println("应用blackAndWhite滤镜");
        } else if (filter.equals("backgroundBlur")) {
            System.out.println("应用blackAndBlur滤镜");
        }
    }
}

模式实现

Read more   2020/2/26 posted in  设计模式 JAVA

dotenv 2到3版本设计模式重构实战分析

老大说了这个dotenv的重构比较适合用来学习,进行了分析,并分享了出来

github项目地址: https://github.com/vlucas/phpdotenv

dotenv是一个php写的从文件中加载环境变量的库,库本身文件数量较少,比较容易阅读。

核心api变动

2.x实例化方式

$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig');
$dotenv->load();

3.x实例化方式

$dotenv = Dotenv\Dotenv::create(__DIR__, 'myconfig');
$dotenv->load();

静态工厂方法设计模式应用

这个3.x版本create方法创建对象使用的是工厂方法设计模式

核心实例化dotenv对象由手动调用构造方法重构成了静态工厂方法,这个改变是因为这个dotenv加载.env文件需要判断env文件、envFactory对象是否传递,而这个判断是个if else的逻辑,根据构造方法不宜写逻辑定理,如果不使用静态工厂方法进行重构,那么在new DotEnv之前,必须手动判断.env是否存在。在多次实例化这个Dotenv对象时,必然造成代码重复。

通过工厂方法封装创建对象的逻辑,以避免创建对象的代码重复,是非常常见的一种设计模式的最佳实践

Read more   2019/7/21 posted in  PHP 设计模式

使用staruml画uml图

staruml图表类型

可以看到staruml支持的图的类型,一般下面两种类型比较常用

  1. Class Diagram: 类图
  2. Sequence Diagram: 时序图
Read more   2019/6/21 posted in  UML 一图胜千言 设计模式

职责链设计模式

职责链模式有这些特点:

  1. 需要解决一个问题
  2. 存在多个对象都可以解决这个问题
  3. 按照顺序依次排列对象(链条的特点)

拿数学函数举例,存在一个问题x,对应的解决方案有5种,分别是

  1. f1(x) 可以但不一定能解决问题,如果不能解决问题就调用f2(x)
  2. f2(x) 可以但不一定能解决问题,如果不能解决问题就调用f3(x)
  3. f3(x) 可以但不一定能解决问题,如果不能解决问题就调用f4(x)
  4. f4(x) 可以但不一定能解决问题,如果不能解决问题就调用f5(x)
  5. f5(x) 可以但不一定能解决问题,如果不能解决问题,则问题无法解决

调用方只允许调用f1(x)这个函数,调用方无需关心f2, f3, f4, f5链条的存在,只需要得到最终问题是否能够解决的结果即可。

体现职责链模式有下面几点

  1. f1, f2, f3, f4, f5都有职责解决问题x
  2. 链条体现在f1, f2, f3, f4, f5解决问题x必须按固定顺序进行尝试,比如按照f1, f2, f3, f4, f5的顺序
  3. 链条终止在问题x得到解决,如果所有方案都无法解决问题x,问题x则被标记为责任链无法解决
Read more   2019/6/10 posted in  设计模式