西维蜀黍

【Design Pattern】Behavioural - Strategy

动机

  • 完成一项任务可以有多种不同的方法,每一种方法都可称为一个策略。在特定环境下,我们可以根据不同的需求和具体的环境来决定采用哪一个策略来完成特定的任务;
  • 在软件开发中也是类似的,我们可以使用不同的策略来实现一项功能。比如排序,可以**采用快排(Quick Sort),插入排序(Insert Sort)或选择排序(Selection Sort)**等等。这些不同的排序算法都能实现排序功能,只是他们进行排序时的效率不同。因此,我们要根据具体的情况,来具体选择一个排序算法,以使得在当前情况中排序效率最高;
  • 为了使系统具有较强的扩展性(可能在未来,我们还需要增加新的排序算法),我们的代码需要遵循开闭原则(The Open Closed Principle)
  • 同时,我们编写的这个类对应的调用者(Client),不应该依赖于这个类具体的实现(Implementation),而仅仅依赖于对应的抽象(Abstraction)。或者说,面向接口编程(Program to an interface, not an implementation);
  • 可能有人会提出,我们可以编写一个SortingHelper类(这个类实现了ISortingHelper接口),这个类中包含不同的方法,每个方法都是一种具体排序算法的实现(比如快排、插入排序等等)。很棒!这是一种很好的实现(具有扩展性,同时面向接口编程)。这种实现事实上对应了另一个设计模式,称为模板方法模式(Template Method Pattern)。但这样的实现无法做到在运行时可以任意地切换不同的排序算法;
  • 我们也可以设计一个策略接口(对应于上面例子,则为排序帮助接口),同时包含多个实现了该接口的策略实现类(对应于上面例子,则为XX排序帮助类,如插入排序帮助类)。
  ...


【Architectural Pattern】Model – View – Controller (MVC)

1 背景

MVC (Model - View - Controller)架构是一种当前非常流行的架构模式(Architectural Pattern),被广泛使用于传统的桌面GUI(Graphical user interface)、Web应用和手机移动应用中。

  ...


【Java】Intellij调试程序断点进入JDK源码

需求

IntelliJ中,希望调试自己的程序时,断点能够进入JDK的源代码。

  ...


【Java】Java程序的编译与运行

本文将按照Java源代码从编译到执行的过程,进行一步一步的分析。

  ...


【JavaScript】JavaScript 单线程与异步

JavaScript 单线程设计

JavaScript 的一个很重要的特性就是单线程,即同一个时间点只能够做一件事情。我们不禁会问,为什么不把 JavaScript 设计成多线程呢?

  ...


【Python】Python调试技巧

1 The Python Debugger

PDB,即The Python Debugger,是一个可对源代码进行交互调试的Python调试工具。

增加断点

增加的方法

# 需要引入pdb
import pdb

# 增加断点
pdb.set_trace()

运行结果

当添加pdb.set_trace()后,执行python test1.py,Python解释器会自动执行到 pdb.set_trace() 所在的这一行(下一行b = "bbb"未执行),并且进入pdb调试模式:

pdb 常用命令

命令 意义
c 继续执行程序
s或step 进入函数
exit 或 q 中止并退出
next 或 n 执行下一行
step 或 s 进入函数
p + 变量名 打印变量值
help 帮助
list 显示当前执行到的代码
  ...


【iOS】iOS内存管理

之前接手公司的一个iOS SDK项目,是用MRC进行内存管理的。最终,我将这个项目迁移成了ARC

  ...


【Design Pattern】Behavioural - Memento

1 动机

备忘录模式(Memento Pattern),又称为快照模式(Snapshot Pattern),为对象提供了恢复到先前状态的能力(通过回滚(rollback))。

  ...


【Design Pattern】Creational - Singleton

单例模式(Singleton Pattern)

动机

在涉及同步问题的日志模块、缓存模块、多线程或线程池设计过程中,对于系统中的某些类来说,只有一个实例很重要。

  ...


【Design Pattern】Creational - Builder

When to Use It

  • When an object has many optional fields or configurations.
  • When object construction involves complex steps or validation.
  • When you want to avoid constructor telescoping (i.e., multiple constructors with different parameters).

定义

建造者模式(Builder Pattern)将一个复杂对象的构建与它的表示分离,使得同样的构建过程(但传入的参数不同)可以创建不同的表示。

构成

The Builder pattern typically involves:

  1. Product – the complex object being built.
  2. Builder – an interface or abstract class defining building steps.
  3. ConcreteBuilder – implements the Builder, maintaining the product.
  4. Director (optional) – controls the building sequence.

Java Example

public class House {
    private int rooms;
    private int floors;
    private boolean hasGarage;
    private boolean hasSwimmingPool;

    private House(Builder builder) {
        this.rooms = builder.rooms;
        this.floors = builder.floors;
        this.hasGarage = builder.hasGarage;
        this.hasSwimmingPool = builder.hasSwimmingPool;
    }

    public static class Builder {
        private int rooms;
        private int floors;
        private boolean hasGarage;
        private boolean hasSwimmingPool;

        public Builder rooms(int rooms) {
            this.rooms = rooms;
            return this;
        }

        public Builder floors(int floors) {
            this.floors = floors;
            return this;
        }

        public Builder hasGarage(boolean hasGarage) {
            this.hasGarage = hasGarage;
            return this;
        }

        public Builder hasSwimmingPool(boolean hasSwimmingPool) {
            this.hasSwimmingPool = hasSwimmingPool;
            return this;
        }

        public House build() {
            return new House(this);
        }
    }
}

// usage
House myHouse = new House.Builder()
    .rooms(4)
    .floors(2)
    .hasGarage(true)
    .hasSwimmingPool(false)
    .build();

Pros and Cons

✅ Pros

  ...