C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
一、引言 2.4、模式的组成 ?? ? ??? 可以看出,在访问者模式的结构图有以下角色: ??? (1)、抽象访问者角色(Vistor): 声明一个包括多个访问操作,多个操作针对多个具体节点角色(可以说有多少个具体节点角色就有多少访问操作),使得所有具体访问者必须实现的接口。 ??? (2)、具体访问者角色(ConcreteVistor):实现抽象访问者角色中所有声明的接口,也可以说是实现对每个具体节点角色的新的操作。 ??? (3)、抽象节点角色(Element):声明一个接受操作,接受一个访问者对象作为参数,如果有其他参数,可以在这个“接受操作”里在定义相关的参数。 ??? (4)、具体节点角色(ConcreteElement):实现抽象元素所规定的接受操作。 ??? (5)、结构对象角色(ObjectStructure):节点的容器,可以包含多个不同类或接口的容器。 2.5、访问者模式的代码实现 ??? 访问者这个模式在我们现实的编码生活中使用的并不是很多,我就直接贴代码,让大家看代码的结构吧。今天给大家两个代码实例,自己慢慢体会访问者吧。实现代码如下: 1 namespace Vistor 2 { 3 //抽象图形定义---相当于“抽象节点角色”Element 4 public abstract class Shape 5 { 6 画图形 7 void Draw(); 8 外界注入具体访问者 9 Accept(ShapeVisitor visitor); 10 } 11 12 抽象访问者 Visitor 13 ShapeVisitor 14 15 Visit(Rectangle shape); 16 17 Visit(Circle shape); 18 19 Visit(Line shape); 20 21 这里有一点要说:Visit方法的参数可以写成Shape吗?就是这样 Visit(Shape shape),当然可以,但是ShapeVisitor子类Visit方法就需要判断当前的Shape是什么类型,是Rectangle类型,是Circle类型,或者是Line类型。 22 23 24 具体访问者 ConcreteVisitor 25 sealed CustomVisitor : ShapeVisitor 26 27 针对Rectangle对象 28 override Visit(Rectangle shape) 29 { 30 Console.WriteLine("针对Rectangle新的操作!"); 31 } 32 针对Circle对象 33 Visit(Circle shape) 34 35 Console.WriteLine(针对Circle新的操作! 36 37 针对Line对象 38 Visit(Line shape) 39 40 Console.WriteLine(针对Line新的操作! 41 42 43 44 矩形----相当于“具体节点角色” ConcreteElement 45 Rectangle : Shape 46 47 Draw() 48 49 Console.WriteLine(矩形我已经画好! 50 51 52 Accept(ShapeVisitor visitor) 53 54 visitor.Visit(this 55 56 57 58 圆形---相当于“具体节点角色”ConcreteElement 59 Circle : Shape 60 61 62 63 Console.WriteLine(圆形我已经画好! 64 65 66 67 68 visitor.Visit( 69 70 71 72 直线---相当于“具体节点角色” ConcreteElement 73 Line : Shape 74 75 76 77 Console.WriteLine(直线我已经画好! 78 79 80 81 82 visitor.Visit( 83 84 85 86 结构对象角色 87 internal AppStructure 88 89 private ShapeVisitor _visitor; 90 91 public AppStructure(ShapeVisitor visitor) 92 93 this._visitor = visitor; 94 95 96 Process(Shape shape) 97 98 shape.Accept(_visitor); 99 100 101 102 Program 103 104 static void Main(string[] args) 105 106 如果想执行新增加的操作 107 ShapeVisitor visitor = new CustomVisitor(); 108 AppStructure app = AppStructure(visitor); 109 110 Shape shape = Rectangle(); 111 shape.Draw();执行自己的操作 112 app.Process(shape);执行新的操作 113 114 115 shape = Circle(); 116 shape.Draw();117 app.Process(shape);118 119 120 shape = Line(); 121 shape.Draw();122 app.Process(shape);123 124 125 Console.ReadLine(); 126 127 128 } 这是访问者模式第二种代码实例: Visitor 抽象访问者角色 Visitor PutTelevision(Television tv); 7 PutComputer(Computer comp); 9 10 11 具体访问者角色 ConcreteVisitor SizeVisitor : Visitor 13 14 PutTelevision(Television tv) 15 16 Console.WriteLine(按商品大小{0}排放,tv.Size); 17 PutComputer(Computer comp) 20 21 Console.WriteLine( 23 24 26 StateVisitor : Visitor 27 按商品新旧值{0}排放 32 37 38 39 抽象节点角色 Element 40 Goods 42 Operate(Visitor visitor); 44 private int nSize; 45 Size 47 get { return nSize; } 48 set { nSize = value; } 49 50 51 nState; State 54 nState; } 55 set { nState = 57 58 具体节点角色 ConcreteElement 60 Television : Goods 61 62 Operate(Visitor visitor) 63 64 visitor.PutTelevision( 65 66 67 68 69 Computer : Goods 71 72 73 visitor.PutComputer( 75 76 77 78 StoragePlatform 79 private IList<Goods> list = new List<Goods>(); 81 82 Attach(Goods element) list.Add(element); 85 86 87 Detach(Goods element) 89 list.Remove(element); 90 91 92 93 94 foreach (Goods g in list) 95 { 96 g.Operate(visitor); } 100 101 102 103 104 105 StoragePlatform platform = StoragePlatform(); 106 platform.Attach( Television()); 107 platform.Attach( Computer()); 108 109 SizeVisitor sizeVisitor = SizeVisitor(); 110 StateVisitor stateVisitor = StateVisitor(); 111 112 platform.Operate(sizeVisitor); 113 platform.Operate(stateVisitor); 115 Console.Read(); 116 117 118 }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |