add Visitor Design Pattern