`
ysen
  • 浏览: 122143 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

老鸟飞过哈

 

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

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

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

 

 

 

 

 

分享到:
评论
8 楼 mingisme 2009-12-15  
我的理解:假设Boy和Girl的方法代表其功能的话,不改变Person,Boy,Girl的类结构情况下,通过一个accept方法,给Boy或Girl增强其功能。
个人认为,Swich语句在任何时候都丢不掉,楼主只是把swich逻辑丢给main去处理了。
7 楼 gjhohj 2009-12-15  
switch(Object) 话就重构成多态吧。
6 楼 wenxiang_tune 2009-12-14  
哪用封装啊  7的版本不就可以了么
5 楼 ysen 2009-12-14  
xjlnjut730 写道
我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~

自己封装下呗
4 楼 xjlnjut730 2009-12-14  
我菜鸟一个哈~~不过刚看了一下,Java 7 貌似有switch(String)了,嘿嘿,如果只是String就没必要用这个模式吧? 不过我写代码时也感觉总是if else 实在是麻烦,什么时候有switch(Object)那就OK了~~
3 楼 ysen 2009-12-14  
2 楼 zguoxp 2009-12-14  
还是不太懂?
1 楼 konbluesky 2009-12-14  
看到女友的帖子就是你发的..

相关推荐

    C#23种设计模式_示例源代码及PDF

    13、CHAIN OF RESPONSIBLEITY —晚上去上英语课,为了好开溜坐到了最后一排,哇,前面 、 坐了好几个漂亮的 MM 哎, 找张纸条, 写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”, 纸条就一个接一个的传上去了,...

    趣味JAVA23种设计模式

    如同请女朋友去麦当劳吃汉堡,具体要什么口味的汉堡,可以让女朋友自己选择,工厂方法模式提供了这种灵活性。这种模式的优势在于支持开闭原则,易于扩展,但引入了更多的类。 #### 原型模式(Prototype) 原型模式...

    23种设计模式幽默见解

    在例子中,处理与女朋友的沟通问题可能需要经过多个人的判断和决策,职责链模式可以确保每个参与者都有机会处理问题,直到找到最终的解决方案。在软件设计中,职责链模式可以用于处理事件、过滤请求等场景,提供了一...

    二十三种设计模式通俗理解

    装饰者模式允许在不改变对象结构的前提下动态地增加功能。比如,给女朋友准备生日礼物时,您可能先拍一张照片,然后配上一段文字,再加上一个精美的相框。在这个过程中,每一步都可以看作是对礼物的一种装饰。 **...

    一个23设计模式的搞笑解释

    - **比喻**:请女朋友吃汉堡,不同的女孩有不同的口味,这时工厂方法模式就派上了用场,你只需要告诉服务员“我要一个汉堡”,至于是哪种汉堡,由女朋友直接告诉服务员。 - **原理**:定义一个用于创建对象的接口...

    关于23种设计模式的有趣见解(通俗易懂)

    装饰者模式允许在不改变现有对象结构的情况下动态地增加功能。文章中的例子是将一张照片加上相框和精美的包装盒。 **优点**: - 动态扩展对象的功能。 - 替代继承。 **缺点**: - 多重装饰容易导致类的数量增多。 ...

    23种设计模式的比喻

    例如,当你带女朋友去快餐店,无论是麦当劳还是肯德基,只需要告诉服务员“我要四个鸡翅”,而不需要关心具体哪家店生产的鸡翅。 - **原理**: 在工厂模式中,客户类和工厂类是分离的。消费者只需要知道如何向工厂...

    关于java23种设计模式的有趣见解

    装饰者模式就像为一个核心功能添加额外功能的过程,使得礼物更加个性化和有意义。 以上设计模式的解析不仅涵盖了它们的基本定义和应用场景,还通过生动的比喻帮助理解,展示了设计模式在实际生活中的潜在应用。通过...

    java23种设计模式与追MM

    17. **访问者模式**:GG作为访问者,访问MM的朋友圈,访问者模式允许在不修改对象结构的情况下增加新的操作。 18. **模版方法模式**:GG追求MM的过程可以有固定的步骤,模版方法模式定义一个操作中的算法骨架,而将...

    java二十三种设计模式

    11.책模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。 12. 命令模式(Command):将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行...

    送给女朋友的精美网页

    标签"表白女朋友 网页 情人节"表明这个项目具有浪漫和情感传达的目的,因此网页设计需要注重情感表达和用户体验。设计师可能需要运用浪漫色彩搭配,比如粉色、红色调,以及心形等爱情符号。同时,交互设计也需要考虑...

    Java 24种设计模式

    单例模式确保一个类只有一个实例,并提供一个全局访问点。 **应用场景:** 当你希望在整个系统中只存在一个实例时,例如数据库连接、线程池等资源。 **优点:** - 确保系统中只有一个实例。 - 全局唯一性。 **...

    设计模式与现实生活,形象,生动

    例如,你遇到一位来自香港的女孩,你们无法直接交流,这时候可以通过一个懂普通话和粤语的朋友来充当“适配器”,使得双方能够顺利沟通。在编程中,适配器模式的作用是使原本接口不兼容的类可以一起工作。 **7. ...

    追MM与23种设计模式

    迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问集合中的元素,而又不暴露集合的内部表示。在“追MM”的过程中,可以通过迭代器模式来管理不同阶段的追求行动,确保每个阶段都按计划进行。 #### 17. ...

    网页向女友告白和纪念日专用特效

    网页向女友告白和纪念日专用特效是一种创新的表达情感的方式,通过技术手段在网页上营造出浪漫的氛围,让告白或者庆祝纪念日变得更加特别。这个特效可能包含动画、音乐、互动元素以及个性化的文字内容,旨在为用户...

    前端网页+h5+js 用于送给女朋友

    标题中的“前端网页+h5+js 用于送给女朋友”表明这是一个使用HTML5和JavaScript技术制作的前端网页项目,目的可能是为了庆祝女朋友的生日或者作为特别的礼物。HTML5是超文本标记语言的最新版本,提供了许多增强用户...

    23种设计模式与泡MM的关系

    6. 适配器模式(Adapter):适配器模式就像朋友在不同语言间起的桥梁作用,将不兼容的接口转换为可协作的接口,使得原本不能一起工作的类能够协同工作。 7. 桥梁模式(Bridge):桥接模式将抽象部分与实现部分解耦...

    设计模式_通俗易懂

    假设你经常需要请女朋友吃饭,并且她喜欢吃鸡翅,无论是麦当劳的还是肯德基的。这时,你可以将麦当劳和肯德基视为“鸡翅工厂”。当你带她去这些地方时,只需要告诉服务员“来四个鸡翅”,而不需要指定是哪个品牌的...

Global site tag (gtag.js) - Google Analytics