论坛首页 入门技术论坛

和女友的不愉快(访问者模式)

浏览 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的漂亮点
独自去旅游,那个书呆子没救了,嘿嘿

 

 

 

 

 

   发表时间:2009-12-14   最后修改:2009-12-14
看到女友的帖子就是你发的..
0 请登录后投票
   发表时间:2009-12-14  
还是不太懂?
0 请登录后投票
   发表时间:2009-12-14  
0 请登录后投票
   发表时间:2009-12-14  
我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~
0 请登录后投票
   发表时间:2009-12-14  
xjlnjut730 写道
我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~

自己封装下呗
0 请登录后投票
   发表时间:2009-12-14  
哪用封装啊  7的版本不就可以了么
0 请登录后投票
   发表时间:2009-12-15  
switch(Object) 话就重构成多态吧。
0 请登录后投票
   发表时间:2009-12-15   最后修改:2009-12-15
我的理解:假设Boy和Girl的方法代表其功能的话,不改变Person,Boy,Girl的类结构情况下,通过一个accept方法,给Boy或Girl增强其功能。
个人认为,Swich语句在任何时候都丢不掉,楼主只是把swich逻辑丢给main去处理了。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics