^

Young Anything I do that may help others, I'll post it here.

Strategy Pattern

策略模式

策略模式就是在多种不同业务逻辑上抽象出策略接口和context类,context类的构造函数接收该接口的参数,其余函数用来封装策略的函数。然后在client端实例化具体的策略类,传给context实例化,然后用context对象的函数来使用传入的策略的函数。

  1. 需要在不同时间应用不同的业务规则(算法),就可以考虑使用策略模式处理这种变化。

  2. switch可能是一个信号表明此处可以考虑使用策略模式,即使用接口来代替switch。
  3. 简化了单元测试,每个算法都有自己的类,可以通过自己的接口单独测试。

  4. 再抽象一层意味着,客户端(使用端)代码可以直接用更上层的context,就可以在需要修改时不用更改主体logic,是一种解耦,避免大量修改代码。
  5. 变体:若允许,可简化策略类为函数,用delegate传入context的参数来使用这些策略函数。
  6. (大话设计模式)Client端用switch来选择策略传给context时,可以让这个switch转到context的构造函数,这样就把策略的选择逻辑与客户端分离开,耦合更加低。

strategy

...
more »

State Pattern

状态模式

一种行为模式。消除庞大的分支语句,通过把各种状态转移逻辑分布到state的子类之间,减少相互间依赖。

复杂的状态转换逻辑被分散到各个具体子状态对象中,然后根据context的具体需求,context上绑定的状态为其交接其他状态

将特定的状态相关的行为都放入一个对象内,由于所有与状态相关的代码都存在于某个ConcreteState内,所以通过定义新的子类就可以很容易地增加新的状态和转换。

应用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时;
  2. 某项业务需要有多个状态,通常都是枚举常量,状态的变化依靠大量分支判断实现。

state

...
more »

Specification Pattern

规约模式

rule

...
more »

Singleton Pattern

单例模式

影响
  1. 单例为相关使用它的类引入了紧密的耦合;
  2. 为测试带来了困难;
  3. 通常使用IOC容器来避免耦合和测试问题;
  4. 应该用IOC容器来管理对象声明周期。

线程不安全单例

普通单例
  1. 直接在单例上调用起内部方法;
  2. 可以将单例赋值给变量;
  3. 可以直接当参数传进其他方法;
  4. 线程不安全,不能用于多线程,如ASP.NET。

singleton

...
more »

Service Locator Pattern

服务定位器模式

帮助clients找到远端服务器的服务。

创建类模式

  • 抽象工厂
  • 建造者
  • 工厂方法
  • 原型
  • 单例

使用场景

  • logging
    • 使用贯穿整个app
    • 独立于任何业务逻辑
    • 容易为各app的简单需求独立实现
    • 常常基于环境或者部署的需求而改变

program在运行启动时用ServiceLocator注册所需的logger, ServiceLocator里静态的各种方法就可以在别处GetService获得想要的logger。具体的logger类实现`ILog`的各种接口方法。

servicelocator

相关模式

  • 观察者模式:定位新的服务,在他们变得可用时
  • 代理模式:总可以用一个服务定位器来讲代理和实现匹配
  • 适配器模式:适配器模式可以将具体services适配到符合通用接口
  • 依赖注入:在创建客户端时传入services
...
more »