Pattern Visitor

  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
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package ru.rpod.taop.visitor;
/**
* @author golodnyj
* @version 0.1
*/
public interface Visitor {
public void visit(Apple v);
public void visit(Bread v);
}
package ru.rpod.taop.visitor;
/**
* @author golodnyj
* @version 0.1
*/
public interface Visitable {
public void accept(Visitor v);
}
package ru.rpod.taop.visitor;
/**
* @author golodnyj
* @version 0.1
*/
public class Apple implements Visitable{
private int price;
public Apple(int price) {
this.price = price;
}
public void accept(Visitor v) {
v.visit(this);
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
package ru.rpod.taop.visitor;
/**
* @author golodnyj
* @version 0.1
*/
public class Bread implements Visitable{
private int price;
public Bread(int price) {
this.price = price;
}
public void accept(Visitor v) {
v.visit(this);
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
package ru.rpod.taop.visitor;
/**
* @author golodnyj
* @version 0.1
*/
public class Calculator implements Visitor {
private double tax;
public void visit(Apple v) {
System.out.println("Посчитали налоги с яблока");
tax = tax + (0.02 * v.getPrice());
}
public void visit(Bread v) {
System.out.println("Посчитали налоги с хлеба");
tax = tax + (0.03 * v.getPrice());
}
public double getTax() {
return tax;
}
}
package ru.rpod.taop.visitor;
import java.util.*;
/**
* @author golodnyj
* @version 0.1
*/
public class ConsoleVisitor {
public static void main(String[] args) {
Collection<Visitable> c = new ArrayList<Visitable>();
c.add(new Apple(10));
c.add(new Apple(10));
c.add(new Bread(10));
c.add(new Apple(10));
c.add(new Bread(10));
c.add(new Bread(10));
c.add(new Apple(10));
Calculator calc = new Calculator();
Iterator iterator = c.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Visitable)
((Visitable) o).accept(calc);
}
System.out.println("tax = " + calc.getTax());
}
}