访问模式
访问模式(Visitor Pattern): 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,
使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式.
优点 和 缺点
优点:
- 延展性好, 能够在不修改对象结构的元素的情况下, 为对象结构中的元素添加新的功能
- 灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构.
缺点:
- 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。
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
| type Visitor interface { VisitA(a *ConcreteElementA) VisitB(b *ConcreteElementB) } type VisitorA struct { } type VisitorB struct { } type Element interface { Accept(visitor Visitor) }
func (visotor VisitorA) VisitA(a *ConcreteElementA) { fmt.Println("Visitor A visit element a") a.OperationA() } func (visotor VisitorA) VisitB(b *ConcreteElementB) { fmt.Println("Visitor A visit element b") b.OperationB() }
func (visotor VisitorB) VisitA(a *ConcreteElementA) { fmt.Println("Visitor B visit element a") a.OperationA() } func (visotor VisitorB) VisitB(b *ConcreteElementB) { fmt.Println("Visitor B visit element b") b.OperationB() }
type ConcreteElementA struct { }
func (e *ConcreteElementA) Accept(visitor Visitor) { visitor.VisitA(e) } func (e *ConcreteElementA) OperationA() { fmt.Println(" operation A") }
type ConcreteElementB struct { }
func (e *ConcreteElementB) Accept(visitor Visitor) { visitor.VisitB(e) } func (e *ConcreteElementB) OperationB() { fmt.Println(" operation B") }
type ObjectStructure struct { elements []Element }
func (o *ObjectStructure) Accept(visitor Visitor) { for _, v := range o.elements { v.Accept(visitor) } } func (o *ObjectStructure) Add(e Element) { if o.elements == nil { o.elements = []Element{} } o.elements = append(o.elements, e) } func (o *ObjectStructure) Remove(e Element) { if o.elements == nil { return } for i, v := range o.elements { if v == e { o.elements = append(o.elements[0:i], o.elements[i+1:]...) } } }
|