add facade and visitor mode