-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvisitor_pattern.py
More file actions
48 lines (36 loc) · 1.17 KB
/
visitor_pattern.py
File metadata and controls
48 lines (36 loc) · 1.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from abc import ABC, abstractmethod
class Visitor(ABC):
@abstractmethod
def visit(self, miner: "Miner") -> int: ...
class Miner(ABC):
@abstractmethod
def mine(self) -> None: ...
@abstractmethod
def accept_visit(self, visitor: "Visitor") -> int: ...
class IncomeVisitor(Visitor):
def visit(self, miner: Miner) -> int:
return miner.income
class TimesVisitor(Visitor):
def visit(self, miner: Miner) -> int:
return miner.times_ago
class BitcoinMiner(Miner):
def __init__(self):
self.income = 0
self.times_ago = 0
def mine(self) -> None:
self.income += 100
self.times_ago += 1
print("im mining bitcoin")
print(f"i got {self.income}$")
def accept_visit(self, visitor: Visitor) -> int:
return visitor.visit(self)
if __name__ == '__main__':
miner = BitcoinMiner()
income = IncomeVisitor()
times = TimesVisitor()
miner.mine()
miner.mine()
print("")
now_income = miner.accept_visit(income)
how_many_times = miner.accept_visit(times)
print(f"{now_income}$, {how_many_times} times")