@Entity
//set inheritance type
public class Party {
private String name;
public String getName() {
return name;
}
}
@Entity
public class Group extends Party {
List getGroupMembers() {
return groupMembers;
}
}
@Entity
public class Donation {
//fetchType is set to lazy
private Party;
public Party getParty {
return Party;
}
}
public class CharityService {
public void sendThanksMailToParty(Donation donation){
Party party = donation.getParty();
//instaneof operator would alsways return false ,even if
//Party is really Group
//because Proxy is subclass of Party, it does not know about Group
//Proxy has a target and it delegates method calls to it.
if(party instanceOf Group){
//send email to every group member
}
}
}
public interface Visitable {
public void accept(Visitor visitor);
}
public interface Visitor {
public void visit(Party party);
public void visit(Group group);
}
public class DefaultVisitor extends Visitor {
public void visit(Party party){};
public void visit(Group group){};
}
@Entity
//set inheritance type
public class Party implements Visitable{
private String name;
public String getName() {
return name;
}
public void accept(Visitor visitor){
visitor.visit(this);
}
}
@Entity
public class Group extends Party implements Visitable{
List getGroupMembers() {
return groupMembers;
}
public void accept(Visitor visitor){
visitor.visit(this);
}
}
public class CharityService {
public void sendThanksMailToParty(Donation donation){
Party party = donation.getParty();
party.accept(new DefaultVisitor(){
public void visit(Group group){
List parties= group.getGroupMembers;
//now send email to each member of party
}
});
}
}
Read more: http://feeds.dzone.com/~r/dzone/snippets/~3/u7kci8XGrM8/11555