关于《大话设计模式》访问者模式菜鸟的一些疑问
首先申明一下,本人绝对是个菜鸟,虽然做过一些小得不能再小的项目(基本说不上项目),所以文章中可能会出现一些很2的问题。
最近在看程杰的《大话设计模式》,之前一直未接触过设计模式,我觉得这本书写得很好,很适合初学者,尤其是小菜的故事让菜鸟级的程序员倍感亲切。
好了废话不多说。进入正题。
首先说一下需求。程序要求实现当男人和女人在不同状态下的反应。
男人成功时,背后多半有一个伟大的女人。
女人成功时,背后多半有一个伟大的男人。
男人失败时,闷头喝酒,谁也不用劝。
女人失败时,眼泪汪汪,谁也劝不了。
男人恋爱时,凡是不懂也要装懂。
女人恋爱时,遇事懂也装作不懂。
PS: 男女对比这么多的原因就是因为人类在性别上就只有男人和女人两类。
1 访问者模式的代码: 2 3 //状态类的基类 4 5 abstract class Action 6 { 7 public abstract void GetManConclusion(Man concreteElementA); 8 public abstract void GetWomanConclusion(Woman concreteElementB); 9 } 10 11 //成功状态类,其他状态的类基本差不多,代码我就省略了 12 13 class Success : Action 14 { 15 public override void GetManConclusion(Man concreteElementA) 16 { 17 Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人.", concreteElementA.GetType().Name, this.GetType().Name); 18 } 19 public override void GetWomanConclusion(Woman concreteElementB) 20 { 21 Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人。", concreteElementB.GetType().Name, this.GetType().Name); 22 } 23 } 24 25 //人物的基类 26 27 abstract class Person 28 { 29 public abstract void Accept(Action visitor); 30 } 31 32 //男人类 33 34 class Man :Person 35 { 36 public override void Accept(Action visitor) 37 { 38 visitor.GetManConclusion(this); 39 } 40 } 41 42 //女人类 43 44 class Woman : Person 45 { 46 public override void Accept(Action visitor) 47 { 48 visitor.GetWomanConclusion(this); 49 } 50 } 51 52 //对象结构,为高层提供方便的调用接口 53 54 class ObjectStructure 55 { 56 private IList<Person> elements = new List<Person>(); 57 58 //增加 59 public void Attach(Person element) 60 { 61 elements.Add(element); 62 } 63 //移除 64 public void Detach(Person element) 65 { 66 elements.Remove(element); 67 } 68 //查看 69 public void Display(Action visitor) 70 { 71 foreach (Person e in elements) 72 { 73 e.Accept(visitor); 74 } 75 } 76 77 } 78 79 80 81 客户端调用: 82 83 static void Main(string[] args) 84 { 85 ObjectStructure o = new ObjectStructure(); 86 o.Attach(new Man()); 87 o.Attach(new Woman()); 88 89 Success v1 = new Success(); 90 o.Display(v1); 91 92 Failing v2 = new Failing(); 93 o.Display(v2); 94 95 Amativeness v3 = new Amativeness(); 96 o.Display(v3); 97 98 Console.Read(); 99 100 } 101 102 103 104 我个人的代码: 105 106 //状态类 107 108 abstract class Action 109 { 110 public abstract void GetManConclusion(); 111 public abstract void GetWomanConclusion(); 112 public abstract void GetAllConclusion(); 113 } 114 115 //成功的状态类,其他状态类和成功类一样,代码我就省略了。 116 117 class Success : Action 118 119 { 120 public override void GetManConclusion() 121 { 122 Console.WriteLine("男人{0}时,成功的男人好帅。",this.GetType().Name); 123 } 124 public override void GetWomanConclusion() 125 { 126 Console.WriteLine("女人{0}时,成功的女人很可怕.", this.GetType().Name); 127 } 128 public override void GetAllConclusion() 129 { 130 GetManConclusion(); 131 GetWomanConclusion(); 132 } 133 } 134 135 客户端调用: 136 137 static void Main(string[] args) 138 { 139 Action action = new Success(); 140 action.GetAllConclusion(); 141 action = new Failing(); 142 action.GetAllConclusion(); 143 action = new Amativeness(); 144 action.GetAllConclusion(); 145 Console.ReadLine(); 146 }
我的思考方式是直接把ation当作最主要的对象,反正男人和女人是固定的,干脆就写死在action的两个函数里面。
我觉得还是我的代码更简洁,而且反正是男人和女人固定的,不会改变。如果增加状态的话也是只要增加一个类和客户端调用,我感觉相比较书本上的代码还是我的代码比较简洁。以上是我这个初学者的看法,或者说我看错这本书的侧重点了,望各位大牛提出意见啊。