目录
6.1 面向可复用性和可维护性的设计模式:
- 设计模式:
- 创建型模式 Creational patterns:
- Factory method pattern
- 结构型模式 Structural patterns:
- Adapter
- Decorator
- 行为类模式 Behavioral patterns:
- Strategy
- Template method
- Iterator
- Visitor
- 除了类本身,设计模式更强调多个类/对象之间的关系和交互过程--比接口/类复用的粒度更大
- 创建型模式 Creational patterns:
1. Factory Method 工厂方法:
- 又称“虚拟构造器”
-
解决的问题:当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
当然也可以通过直接定义静态工厂方法来创建子类实例。
-
例:
相比于通过构造器(new)构建对象:1. 静态工厂方法可具有指定的更有意义的名称2. 不必在每次调用的时候都创建新的工厂对象3. 可以返回原返回类型的任意子类型注:每增加一种产品,就需要增加一个新的工厂子类
2.Adapter 适配器模式:
解决的问题:解决类之间接口不兼容的问题
3.Decorator装饰器模式:
- 即用每个子类实现不同的特性
- 以递归的方式实现
- 接口:定义装饰物执行的公共操作
4.Strategy 策略模式:
5.Template Method 模板模式:
做事情的步骤一样,但具体方法不同注: 使用继承和重写实现模板模式
6. Observer 观察者模式:
解决的问题:“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动。
粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝(回调callback粉丝的特定功能)。这是一个双向delegate的关系,例:
7. Visitor:
解决的问题:对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类。
为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT
本质上是将数据和作用于数据上的某种/些特定操作分离开来。
8 、共性和差异
Strategy vs. visitor
-
同:二者都是通过delegation建立两个对象的动态联系
-
Visitor:强调是的外部定义某种对ADT的操作,该操作于ADT自身关系不大(只是访问ADT),故ADT内部只需要开放accept(visitor)即可,client通过它设定visitor操作并在外部调用。
visitor是站在外部client的角度,灵活增加对ADT的各种不同操作(哪怕ADT没实现该操作)。
-
Strategy:强调是对ADT内部某些要实现的功能的相应算法的灵活替换。这些算法是ADT功能的重要组成部分,只不过是delegate到外部strategy类而已。
strategy是站在内部ADT的角度,灵活变化对其内部功能的不同配置。
6.2 正则表达式
正则语法:简化之后可以表达为一个产生式而不包含任何非终止节点。不能有非终止节点。
所以一个正则表达式应该是这样的:markdown ::= ([^_]* | ‘_’ [^_]* ‘_’ )*
去除引号和空格,从而表达更简洁(更难懂):markdown ::= ([^_]*|_[^_]*_)*
为了简化表示,定义了一些简化的表示方式:
- . : 表示任意字符
- \d:表示任意整数,意义同[0-9]
- \s:任何空格字符,包括空格,制表符,换行符
- \w:任何单词字符,包括下划线,意义同[a-zA-Z_0-9]
- \.,,,,\*,\+,…: 对操作符或特殊字符进行转义,以便从字面上匹配