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

本文通过一个具体的例子,展示了如何使用访问者模式和双分派技术重构充满if-else条件判断的代码,使其更加灵活且易于扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

老鸟飞过哈

 

最近和女友很不和,特此用段模式写下自己的状况

我和女友总是为遇到同样的状况而意见不合

比如最近我总于有空余的时间,我想利用这点时间学习下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的漂亮点
独自去旅游,那个书呆子没救了,嘿嘿

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值