浏览 4373 次
锁定老帖子 主题:和女友的不愉快(访问者模式)
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-13
最后修改:2009-12-13
老鸟飞过哈
最近和女友很不和,特此用段模式写下自己的状况 我和女友总是为遇到同样的状况而意见不合 比如最近我总于有空余的时间,我想利用这点时间学习下ps,她非要我和她去苏州玩╮(╯▽╰)╭,其实我是很懒的一个人,不喜欢到处乱窜,她却说偶没情调╮(╯▽╰)╭
言归正传 先来看段比较糟糕的代码
伪代码自己随便写了
public Boy :Person{ public override getResult(){ if(action=="用时间"){ println("学习ps"); }else if (action=="有钱"){ println("给老婆买衣服"); }else if.... } } 这段代码充斥着if else
下面来改写这段代码 将“有时间” “有钱” 等这些状态 抽象出来,并通过两次分派处理将算法还是交给这些状态
//定义的算法(访问者) public abstract class Action { //这里的方法个数必须是固定的,不能扩展,如果扩展了,就违背了开放封闭原则,这样设计的目的主要是扩展的是增加它的子类 public abstract void getResult(Boy boy); public abstract void getResult(Girl girl); }
下面是具体实现
//访问者 public class HaveMoney extends Action{ public void getResult(Boy boy) { System.out.println("给老婆买件衣服"); } public void getResult(Girl girl) { System.out.println("给自己买件衣服"); } }
//访问者 public class HaveSparetime extends Action { public void getResult(Boy boy) { System.out.println("听音乐,学习ps,把老婆P的漂亮点,嘿嘿"); } public void getResult(Girl girl) { System.out.println("独自去旅游,那个书呆子没救了,哦也"); } }
//访问者 public class Weekend extends Action{ public void getResult(Boy boy) { System.out.println("⊙﹏⊙b汗 周末睡觉呗"); } public void getResult(Girl girl) { System.out.println("O(∩_∩)O哈哈~ 周末逛超市呗"); } }
下面的Boy 和 Girl 这两个结构是不能变的
public class Boy extends Person{ //这里有两次派送,首先客户端将状态(访问者)传给Boy 完成第一次派送, //然后将Boy自由传给状态(访问者)完成第二次派送, //就是说处理的具体算法是在访问者中完成的,Boy 和 Girl 的结构是定下来不变的。 public void accept(Action action) { action.getResult(this); } }
public class Girl extends Person { public void accept(Action action) { action.getResult(this); } }
下面是对象结构的上下文,对boy和girl 对不同状态的反应
public class PersonContext { private List<Person> Persons = new ArrayList<Person>(); //增加 public void attach(Person person){ Persons.add(person); } //移除 public void detach(Person person){ Persons.remove(person); } //显示 public void display(Action action){ for(Person p:Persons){ p.accept(action); } } //客户端 public static void main(String[]args){ PersonContext personContext = new PersonContext(); personContext.attach(new Boy()); personContext.attach(new Girl()); //有钱时候,两人干嘛 Action haveSparetime = new HaveSparetime(); personContext.display(haveSparetime); } } 听音乐,学习ps,把老婆P的漂亮点
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-14
最后修改:2009-12-14
看到女友的帖子就是你发的..
|
|
返回顶楼 | |
发表时间:2009-12-14
还是不太懂?
|
|
返回顶楼 | |
发表时间:2009-12-14
|
|
返回顶楼 | |
发表时间:2009-12-14
我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~
|
|
返回顶楼 | |
发表时间:2009-12-14
xjlnjut730 写道 我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~ 自己封装下呗 |
|
返回顶楼 | |
发表时间:2009-12-14
哪用封装啊 7的版本不就可以了么
|
|
返回顶楼 | |
发表时间:2009-12-15
switch(Object) 话就重构成多态吧。
|
|
返回顶楼 | |
发表时间:2009-12-15
最后修改:2009-12-15
我的理解:假设Boy和Girl的方法代表其功能的话,不改变Person,Boy,Girl的类结构情况下,通过一个accept方法,给Boy或Girl增强其功能。
个人认为,Swich语句在任何时候都丢不掉,楼主只是把swich逻辑丢给main去处理了。 |
|
返回顶楼 | |