04 Mar 2019
策略模式
策略模式就是在多种不同业务逻辑上抽象出策略接口和context类,context类的构造函数接收该接口的参数,其余函数用来封装策略的函数。然后在client端实例化具体的策略类,传给context实例化,然后用context对象的函数来使用传入的策略的函数。
-
需要在不同时间应用不同的业务规则(算法),就可以考虑使用策略模式处理这种变化。
- switch可能是一个信号表明此处可以考虑使用策略模式,即使用接口来代替switch。
-
简化了单元测试,每个算法都有自己的类,可以通过自己的接口单独测试。
- 再抽象一层意味着,客户端(使用端)代码可以直接用更上层的context,就可以在需要修改时不用更改主体logic,是一种解耦,避免大量修改代码。
- 变体:若允许,可简化策略类为函数,用delegate传入context的参数来使用这些策略函数。
- (大话设计模式)Client端用switch来选择策略传给context时,可以让这个switch转到context的构造函数,这样就把策略的选择逻辑与客户端分离开,耦合更加低。
...
04 Mar 2019
状态模式
一种行为模式。消除庞大的分支语句,通过把各种状态转移逻辑分布到state的子类之间,减少相互间依赖。
复杂的状态转换逻辑被分散到各个具体子状态对象中,然后根据context的具体需求,context上绑定的状态为其交接其他状态
将特定的状态相关的行为都放入一个对象内,由于所有与状态相关的代码都存在于某个ConcreteState内,所以通过定义新的子类就可以很容易地增加新的状态和转换。
应用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时;
- 某项业务需要有多个状态,通常都是枚举常量,状态的变化依靠大量分支判断实现。
...
04 Mar 2019
服务定位器模式
帮助clients找到远端服务器的服务。
创建类模式
使用场景
- logging
- 使用贯穿整个app
- 独立于任何业务逻辑
- 容易为各app的简单需求独立实现
- 常常基于环境或者部署的需求而改变
program在运行启动时用ServiceLocator注册所需的logger, ServiceLocator里静态的各种方法就可以在别处GetService获得想要的logger。具体的logger类实现`ILog`的各种接口方法。
相关模式
- 观察者模式:定位新的服务,在他们变得可用时
- 代理模式:总可以用一个服务定位器来讲代理和实现匹配
- 适配器模式:适配器模式可以将具体services适配到符合通用接口
- 依赖注入:在创建客户端时传入services
...