Skip to content

Commit a0444cb

Browse files
committed
add visitor
1 parent 5912c41 commit a0444cb

37 files changed

+684
-14
lines changed

docs/uml/design-pattern-source3.eddx

7.04 KB
Binary file not shown.

docs/uml/state-pattern.png

2.03 KB
Loading

docs/uml/visitor-pattern.png

130 KB
Loading

observer-pattern/java/test/Test.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public static void main(String[] args) {
3939
* jarry@jarrys-MacBook-Pro java % javac -encoding utf-8 test/Test.java
4040
* jarry@jarrys-MacBook-Pro java % java test/Test
4141
* test start:
42-
* test start:
4342
* ConcreteSubject::register() [observer = ConcreteObserver]
4443
* ConcreteSubject::register() [observer = ConcreteObserver2]
4544
* ConcreteSubject::notify() [content = hello, this is broadcast.]

state-pattern/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ ConcreteStateA,ConcreteStateB: 具体的实现类,实现了State中定义的
1616
1. 创建State状态接口,包括全部动作状态。
1717
2. 分别创建不同的状态类,实现State抽象接口,不同状态类的方法要实现不同类的切换。
1818
3. 创建Context执行对象,关联到状态接口,允许状态切换。
19+
4. 客户调用方通过初始化执行对象,设置初始状态,再调用执行对象动作的同时切换状态。
1920

2021
# UML
2122
<img src="../docs/uml/state-pattern.png">

state-pattern/python/src/ConcreteStateOff.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ConcreteStateOff(State):
1111
def on(self, context):
1212
print(self.__class__.__name__ + '::on() [turn ON ok!]')
1313
# 状态变为on后,状态类切换到ConcreteStateOn
14-
context.setState(ConcreteFactory.get('on'))
14+
context.set_state(ConcreteFactory.get('on'))
1515

1616
def off(self, context):
1717
# 当前是off状态,再点击off只是提示,不切换状态类

state-pattern/python/src/ConcreteStateOn.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ def off(self, context):
1818
# 状态变为off后,状态类切换到ConcreteStateOff
1919
print(self.__class__.__name__ +
2020
"::off() [needn't switch, state is OFF.]")
21-
context.setState(ConcreteFactory.get('off'))
21+
context.set_state(ConcreteFactory.get('off'))
2222

state-pattern/python/src/Context.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ def __init__(self, state):
1313
def __init__(self):
1414
self.state = None
1515

16-
def getState(self):
16+
def get_state(self):
1717
return self.state
1818

19-
def setState(self, state):
20-
print(self.__class__.__name__ + '::setState() [state = ' +
19+
def set_state(self, state):
20+
print(self.__class__.__name__ + '::set_state() [state = ' +
2121
state.__class__.__name__ + ']')
2222
self.state = state
2323

24-
def turnOn(self):
24+
def turn_on(self):
2525
self.state.on(self)
2626

27-
def turnOff(self):
27+
def turn_off(self):
2828
self.state.off(self)

state-pattern/python/test/test.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ def test():
2121

2222
context = Context()
2323
# 初始状态是off
24-
context.setState(ConcreteStateOff())
24+
context.set_state(ConcreteStateOff())
2525
# turn on
26-
context.turnOn()
26+
context.turn_on()
2727
# 再次turn on
28-
context.turnOn()
28+
context.turn_on()
2929
# turn off
30-
context.turnOff()
30+
context.turn_off()
3131
# 再次turn off
32-
context.turnOff()
33-
print('context.state: ' + context.getState().__class__.__name__)
32+
context.turn_off()
33+
print('context.state: ' + context.get_state().__class__.__name__)
3434

3535

3636
if __name__ == '__main__':

visitor-pattern/README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# 简介
2+
访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。
3+
4+
当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩展功能,这时候适合用访问者模式。访问者模式的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。
5+
6+
访问者模式有以下几个角色:
7+
- 结构对象(ObjectStructure):结构对象角色,这是访问者模式的基础角色,包含多个类或者接口.
8+
- 抽象元素(Element):定义一个接受访问操作accept(),以一个访问者Visitor作为参数。
9+
- 具体元素(ConcreteElement):实现抽象节点的accept()方法和处理操作,调用Vistor的访问方法实现具体功能。
10+
- 抽象访问者(Visitor):定义一个抽象接口,声明一个或多个访问操作,使得所有具体访问者都必须实现。
11+
- 具体访问者(ConcreteVisitor):具体访问者角色,实现Visitor声明的接口。
12+
13+
# 作用
14+
1. 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者,从而把不变的固定起来,把变化的开放出去。
15+
2. 通过隔离类中变化的东西,固定不变的东西,符合单一职责原则,同时具备较好的扩展性和灵活性。
16+
17+
# 实现步骤
18+
1. 先创建基本元素抽象类Element,确定accept()抽象方法。
19+
2. 分别创建几个具体的元素类,实现抽象元素的accept方法。
20+
3. 在创建Visitor抽象接口,定义visit方法,调用具体元素。
21+
4. 创建1个或多个Visitor类,继承抽象接口,客户将以此去访问具体元素。
22+
5. 再创建对象结构类,这是核心入口类,负责组合各种元素,以及传递访问者Visitor。
23+
6. 客户调用时先创建对象结构类,再指定访问者类,通过访问这类调用具体元素类
24+
25+
# UML
26+
<img src="../docs/uml/visitor-pattern.png">

0 commit comments

Comments
 (0)