Tôi có một hệ thống phân cấp các lớp đại diện cho các điều khiển GUI. Một cái gì đó như thế này:
Control->ContainerControl->Form
Tôi phải triển khai một loạt các thuật toán làm việc với các đối tượng làm nhiều việc khác nhau và tôi nghĩ rằng mô hình của Khách truy cập sẽ là giải pháp sạch nhất. Ví dụ như một thuật toán tạo ra biểu diễn Xml của hệ thống phân cấp các đối tượng. Sử dụng phương pháp 'cổ điển' tôi sẽ làm điều này:
public abstract class Control
{
public virtual XmlElement ToXML(XmlDocument document)
{
XmlElement xml = document.CreateElement(this.GetType().Name);
// Create element, fill it with attributes declared with control
return xml;
}
}
public abstract class ContainerControl : Control
{
public override XmlElement ToXML(XmlDocument document)
{
XmlElement xml = base.ToXML(document);
// Use forech to fill XmlElement with child XmlElements
return xml;
}
}
public class Form : ContainerControl
{
public override XmlElement ToXML(XmlDocument document)
{
XmlElement xml = base.ToXML(document);
// Fill remaining elements declared in Form class
return xml;
}
}
Nhưng tôi không chắc làm thế nào để làm điều này với mẫu khách truy cập. Đây là cách thực hiện cơ bản:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Vì ngay cả các lớp trừu tượng cũng giúp triển khai, tôi không chắc làm thế nào để làm điều đó đúng trong ToXmlVisitor?
Lý do tôi đang xem xét mẫu của Khách truy cập là một số thuật toán sẽ cần các tài liệu tham khảo không có sẵn trong dự án nơi các lớp được triển khai và có một số thuật toán khác nhau nên tôi tránh các lớp lớn.