设计模式笔记(24)---访问者模式(行为型)
来源:互联网 发布:网络平台制作软件 编辑:程序博客网 时间:2024/05/17 22:01
Gof定义
表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。
动机
在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?请看下面访问者模式结构图和代码。
访问者模式结构图:
基本代码如下:
/// <summary>/// 声明了一个或多个需要添加的操作/// </summary>public abstract class Visitor{ public abstract void VisitorConcreteElementA(ConcreteElementA concreteElementA); public abstract void VisitorConcreteElementB(ConcreteElementB concreteElementB);}/// <summary>/// 操作的具体类1/// </summary>public class ConcreteVisitor1:Visitor{ public override void VisitorConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementA.GetType().Name); } public override void VisitorConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name); }}/// <summary>/// 操作的具体类2/// </summary>public class ConcreteVisitor2 : Visitor{ public override void VisitorConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementA.GetType().Name); } public override void VisitorConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name); }}/// <summary>/// 接受Visitor并使用其操作的抽象类/// </summary>public abstract class Element{ public abstract void Accept(Visitor visitor);}/// <summary>/// 接受Visitor并使用其操作的具体类/// </summary>public class ConcreteElementA : Element{ public override void Accept(Visitor visitor) { visitor.VisitorConcreteElementA(this); } public void OperationA() { }}/// <summary>/// 接受Visitor并使用其操作的具体类/// </summary>public class ConcreteElementB : Element{ public override void Accept(Visitor visitor) { visitor.VisitorConcreteElementB(this); } public void OperationB() { }}public class ObjectStructure{ private List<Element> list = new List<Element>(); public void Add(Element element) { list.Add(element); } public void Del(Element element) { if(list.Contains(element)) list.Remove(element); } public void Accept(Visitor visitor) { foreach (Element e in list) { e.Accept(visitor); } }}/// <summary>/// 客户端代码/// </summary>class Program{ static void Main(string[] args) { ObjectStructure os = new ObjectStructure(); os.Add(new ConcreteElementA()); os.Add(new ConcreteElementB()); Visitor cv1 = new ConcreteVisitor1(); Visitor cv2 = new ConcreteVisitor2(); os.Accept(cv2); os.Accept(cv1); }}
Visitor模式的几个要点
- Visitor模式通过所谓双重分发(double dispatch)来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。
- Visitor模式通过所谓双重分发(double dispatch)来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。
- Visitor模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致Visitor类的改变。因此Vistor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。
- 设计模式笔记(24)---访问者模式(行为型)
- C#面向对象设计模式纵横谈 学习笔记24 Visitor访问者模式(行为型模式)
- 设计模式 - 行为型模式 - 访问者模式
- 设计模式->行为型模式->访问者模式
- Java设计模式之行为型模式(访问者模式)
- 设计模式-行为-访问者
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(一)
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(二)
- 设计模式--行为型--访问者模式
- 设计模式18:访问者模式【行为型】
- [设计模式-行为型]访问者模式(Vistor)
- 设计模式-行为型之访问者模式
- 行为型设计模式-访问者模式
- 设计模式(十七)访问者模式(Visitor)-行为型
- 【设计模式】—-(23)访问者模式(行为型)
- java设计模式(行为型)之访问者模式
- 设计模式--访问者模式Visitor(行为型)
- 行为型:设计模式之访问者模式(二十三)
- 有点乱~
- Div+CSS布局入门教程
- EMC78911简介
- 人,机器,机器人:我看 Sikuli
- 常用英语链接 ---转贴---
- 设计模式笔记(24)---访问者模式(行为型)
- 利用ADSL猫指示灯 识别ADSL线路故障
- 在局域网中根据IP地址获得计算机名
- 隐藏模式对话框
- 积极勇敢地面对困难
- 派生类的构造函数和析构函数(C++)
- 写说明书的注意了!word使用技巧1则
- LINQ介绍
- 转 JNI 对象在函数调用中的生命周期