设计模式学习笔记--访问者模式

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:29:39
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// Element说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public abstract class Element
12     {
13         public abstract void Accept(Visitor visitor);
14     }
15 }

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:31:19
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// ConcreteElementA说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public class ConcreteElementA:Element
12     {
13         public override void Accept(Visitor visitor)
14         {
15             visitor.VisitConcreteElementA(this);
16         }
17
18         public void OperationA()
19         { }
20     }
21 }

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:31:52
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// ConcreteElementB说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public class ConcreteElementB:Element
12     {
13         public override void Accept(Visitor visitor)
14         {
15             visitor.VisitConcreteElementB(this);
16         }
17
18         public void OperationB()
19         { }
20     }
21 }

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:28:19
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// Visitor说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public abstract class Visitor
12     {
13         public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
14         public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
15     }
16 }

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:30:34
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// ConcreteVisitor1说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public class ConcreteVisitor1:Visitor
12     {
13         public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
14         {
15             Console.WriteLine("{0}被{1}访问",concreteElementA.GetType().Name ,this.GetType().Name);
16         }
17
18         public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
19         {
20             Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
21         }
22     }
23 }

 1 using System;
 2
 3 namespace Visitor
 4 {
 5     /// <summary>
 6     /// 作者:bzyzhang
 7     /// 时间:2016/6/4 6:34:58
 8     /// 博客地址:http://www.cnblogs.com/bzyzhang/
 9     /// ConcreteVisitor2说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
10     /// </summary>
11     public class ConcreteVisitor2:Visitor
12     {
13         public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
14         {
15             Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);
16         }
17
18         public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
19         {
20             Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
21         }
22     }
23 }

 1 using System;
 2 using System.Collections.Generic;
 3
 4 namespace Visitor
 5 {
 6     /// <summary>
 7     /// 作者:bzyzhang
 8     /// 时间:2016/6/4 6:38:05
 9     /// 博客地址:http://www.cnblogs.com/bzyzhang/
10     /// ObjectStructure说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址
11     /// </summary>
12     public class ObjectStructure
13     {
14         private List<Element> elements = new List<Element>();
15
16         public void Attach(Element element)
17         {
18             elements.Add(element);
19         }
20
21         public void Detach(Element element)
22         {
23             elements.Remove(element);
24         }
25
26         public void Accept(Visitor visitor)
27         {
28             foreach (Element element in elements)
29             {
30                 element.Accept(visitor);
31             }
32         }
33     }
34 }

 1 namespace Visitor
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             ObjectStructure objectStructure = new ObjectStructure();
 8
 9             objectStructure.Attach(new ConcreteElementA());
10             objectStructure.Attach(new ConcreteElementB());
11
12             ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1();
13             ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2();
14
15             objectStructure.Accept(concreteVisitor1);
16             objectStructure.Accept(concreteVisitor2);
17         }
18     }
19 }

时间: 2024-10-08 11:13:21

设计模式学习笔记--访问者模式的相关文章

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习之访问者模式

访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了. 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的.比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问.访问者是一个接口,它拥有一个 visit 方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理.

设计模式学习笔记--外观模式

好久没写设计模式的blog了,这次重新回来填坑,先找一个最简单但是却最常用的设计模式来学习,外观模式.其实说是一个设计模式,其实我们在实际的编程中无时无刻不在用外观模式,可以说这个设计模式已经渗透到编程的各个方便,可能我们自己没感觉出来罢了. 一.外观模式的定义 先来看一下外观模式的定义: 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一系列子系统更加容易使用. 简单解释一下,所谓外观模式,就是在我们设计系统的时候,将若干个子系统的功

学习笔记——访问者模式Visitor

访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用Visitor的方法来扩展. 个人理解,Visitor有点类似于策略模式中的算法,都是通过组合的方法变换原有实现.但访问者的变换粒度是具体函数内部要实现扩展,而策略模式主要是算法实现的替换.

设计模式学习笔记-工厂模式

一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法(Factory Method)使一个类的实例化延迟到其子类: 2.模式中的角色 Product(Map):定义工厂方法所创建的对象的接口. ConcreteProduct(BaiduMap.GaodeMap):具体Product,实现Product接口. Creator(IMapFactory):声明工厂方法,该方法返回一个Product类型的对象. ConcreteCreator(BaiduMapFactory.Gaod

设计模式学习笔记-桥接模式

一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 二.模式中的角色 Abstraction:定义抽象类的接口:维护一个指向Implementor类型对象的指针: RefinedAbstraction:扩充由Abstraction定义的接口: Implementor:定义具体行为,具体特征的应用接口: ConcreteImplementor:实现Implementor. 三.UML类图 四.代码实现 4.1 桥接模式的实现代码 /// <summary> /// 实现 /// &

设计模式学习笔记-建造者模式

一.概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示: 二.模式中的角色 Builder:为创建一个Product对象的各个部件指定抽象接口: ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件:定义并明确它所创建的表示:提供一个检索产品的接口: Director:构造一个使用Builder接口的对象: Product:表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程:包含定义组成部件的类,

设计模式学习笔记--策略模式

定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 我们在使用一些功能时,有时有很多种实现方法,或者多种结果,但是都有同样的使用方法,即调用接口,这就是策略模式. 例子: // 设计模式Demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> using namespa

Java-马士兵设计模式学习笔记-命令模式

一.概述 命令模式 二.代码 1.Client.java 1 public class Client { 2 3 public void request(Server server){ 4 server.addCommand(new TextCommand()); 5 server.addCommand(new ImageCommand()); 6 server.doSomething(); 7 } 8 } 2.Server.java 1 public class Server { 2 3 pr