Skip to content

Commit dcadc02

Browse files
committed
Implement Visitor Pattern for Zoo application
1 parent 10e3070 commit dcadc02

File tree

2 files changed

+118
-6
lines changed

2 files changed

+118
-6
lines changed

.idea/workspace.xml

+3-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Writerside/topics/Visitor.md

+115-5
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,125 @@ classDiagram
101101
- `Element` là một interface hoặc abstract class chứa phương thức accept(), trong đó tham số là một đối tượng Visitor.
102102
- `ConcreteElementA``ConcreteElementB` là các lớp cụ thể triển khai `Element`, mỗi lớp cung cấp triển khai cụ thể cho phương thức accept(), thường là gọi phương thức visit() của Visitor và truyền chính nó như một đối số.
103103

104-
## Cách triển khai
104+
## Cách triển khai Visitor Pattern
105105

106-
Để triển khai Visitor trong Java, ta có thể:
106+
Hãy tưởng tượng một ứng dụng Zoo, nơi bạn muốn thực hiện các hoạt động khác nhau đối với các loài động vật mà không cần thay đổi các lớp động vật. Ví dụ, bạn muốn thực hiện "Feeding" và "Exercising" cho các loài động vật khác nhau. Đây là một tình huống lý tưởng để sử dụng Visitor Pattern.
107107

108-
- Định nghĩa interface Visitor với các phương thức visit tương ứng với từng Element.
108+
### 1. Interface Visitor
109109

110-
- Các Element có phương thức accept nhận vào một Visitor.
110+
Đây là Visitor, định nghĩa các hoạt động (trong trường hợp này là Feeding và Exercising) cho mỗi loại động vật.
111111

112-
- Các ConcreteVisitor triển khai các phương thức visit.
112+
```java
113+
public interface AnimalVisitor {
114+
void visit(Lion lion);
115+
void visit(Tiger tiger);
116+
void visit(Elephant elephant);
117+
}
118+
```
119+
120+
### 2. Interface Element
121+
122+
Đây là Element, mô tả các loài động vật trong zoo.
123+
124+
```java
125+
public interface Animal {
126+
void accept(AnimalVisitor visitor);
127+
}
128+
```
129+
130+
### 3. Concrete Visitor Classes
131+
132+
Các lớp này triển khai `AnimalVisitor` để xác định cách thức thực hiện các hoạt động cho từng loài động vật.
133+
134+
```java
135+
public class FeedingVisitor implements AnimalVisitor {
136+
@Override
137+
public void visit(Lion lion) {
138+
System.out.println("Feeding the lion with some meat.");
139+
}
140+
141+
@Override
142+
public void visit(Tiger tiger) {
143+
System.out.println("Feeding the tiger with chicken.");
144+
}
145+
146+
@Override
147+
public void visit(Elephant elephant) {
148+
System.out.println("Feeding the elephant with fruits and vegetables.");
149+
}
150+
}
151+
152+
public class ExercisingVisitor implements AnimalVisitor {
153+
@Override
154+
public void visit(Lion lion) {
155+
System.out.println("Taking the lion for a run.");
156+
}
157+
158+
@Override
159+
public void visit(Tiger tiger) {
160+
System.out.println("Making the tiger jump through hoops.");
161+
}
162+
163+
@Override
164+
public void visit(Elephant elephant) {
165+
System.out.println("Walking the elephant around the zoo.");
166+
}
167+
}
168+
```
169+
170+
### 4. Concrete Element Classes
171+
172+
Các lớp động vật cụ thể, mỗi loài sẽ có cách tiếp nhận (accept) khách thăm (visitor) riêng.
173+
174+
```java
175+
public class Lion implements Animal {
176+
@Override
177+
public void accept(AnimalVisitor visitor) {
178+
visitor.visit(this);
179+
}
180+
}
181+
182+
public class Tiger implements Animal {
183+
@Override
184+
public void accept(AnimalVisitor visitor) {
185+
visitor.visit(this);
186+
}
187+
}
188+
189+
public class Elephant implements Animal {
190+
@Override
191+
public void accept(AnimalVisitor visitor) {
192+
visitor.visit(this);
193+
}
194+
}
195+
```
196+
197+
### 5. Sử dụng Pattern
198+
199+
Đoạn mã sau đây mô tả cách các động vật được thăm bởi các visitor khác nhau để thực hiện các hoạt động như feeding và exercising.
200+
201+
```java
202+
public class ZooVisitorDemo {
203+
public static void main(String[] args) {
204+
Animal[] animals = new Animal[]{new Lion(), new Tiger(), new Elephant()};
205+
206+
AnimalVisitor feedingVisitor = new FeedingVisitor();
207+
AnimalVisitor exercisingVisitor = new ExercisingVisitor();
208+
209+
System.out.println("Zoo Feeding Time:");
210+
for (Animal animal : animals) {
211+
animal.accept(feedingVisitor);
212+
}
213+
214+
System.out.println("\nZoo Exercise Time:");
215+
for (Animal animal : animals) {
216+
animal.accept(exercisingVisitor);
217+
}
218+
}
219+
}
220+
```
221+
222+
Trong ví dụ này, `FeedingVisitor``ExercisingVisitor` đại diện cho các hoạt động cụ thể được thực hiện trên các loài động vật. Mỗi loài động vật (`Lion`, `Tiger`, `Elephant`) đều triển khai interface `Animal` và định nghĩa phương thức `accept()` để chấp nhận `AnimalVisitor`. Phần demo `ZooVisitorDemo` minh họa cách thức các `Animal` được "thăm" bởi các `AnimalVisitor` để thực hiện feeding và exercising mà không cần sửa đổi code trong các lớp `Animal`.
113223

114224
## Ví dụ
115225

0 commit comments

Comments
 (0)