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

朋友做客(外观模式或者门面模式)

阅读更多

老鸟飞过

 

 

package facade;
/**
 * 
 * 在实际的开发过程中,往往需要将不同的两个层分离,
 * 比如mvc 三层架构
 * 业务层与表现层、持久层与业务层之间建立外观Facade,
 * 这样为新的系统提供简单的接口。
 */
 //facade类 组合了 三个子系统(每个girl是独立的系统)
public class Boy {
	
	private BeautifulGirl beautifulGirl;
	private LivelyGirl  livelyGirl;
	private LooksMediocreGirl looksMediocreGirl;
	
	Boy(){
		beautifulGirl = new BeautifulGirl();
		livelyGirl =new LivelyGirl();
		looksMediocreGirl = new LooksMediocreGirl();
	}
	
	//我的朋友并不知道我有几个女友,因为女友是我私有的,但是给我朋友做饭的不是我,却是我的女友们。
	//我的朋友到我家做客,他不了解我们家的情况,如果让我的朋友直接命令我的女友做家务,也许他会忙的忘记和我讲正事了(违背了单一职责)
	//我朋友 1————1 我(facade) 1————n girls
	//如果没有了我(facade),那么就变成了 我朋友 1————n girls 
	//如果我朋友是待开发的新系统, girls是老系统(之前实现了的)
	//新系统需要用到老的系统提供服务,可是老系统很复杂,
	//开发新系统的人可能不了解老系统是怎么实现的,
	//那么facade 的出现就是提供给新系统 老系统的接口
	public void  dinner_for_friend(Friend friend){
		
		// if...else...可以考虑状态模式重构
		if(  friend.getAges()<30){
			this.methodA();
		}else{
			this.methodB();
		}
		 
		
	}
	
	public void methodA(){
		
		beautifulGirl.do_it();
		livelyGirl.do_something();
		looksMediocreGirl.i_can_do();
		
	}
	public void methodB(){
	
		looksMediocreGirl.i_can_do();
		livelyGirl.do_something();
		beautifulGirl.do_it();
	}

	
}

 

public class BeautifulGirl {
	
	public void do_it(){
		
		System.out.println("来杯咖啡");
	}

}

 

public class LivelyGirl {
	
	
	public void do_something(){
		
		System.out.println("准备午餐");
	}

}

 

public class LooksMediocreGirl {

	public void i_can_do(){
		
		System.out.println("准备点心");
		
	}
	
}

 

 

public class Friend {
	
	int ages;

	
	public int getAges() {
		return ages;
	}

	public void setAges(int ages) {
		this.ages = ages;
	}
	
	

}

 

分享到:
评论
18 楼 ababw1w1 2010-10-19  
希望楼主多多指教,我刚刚才学设计模式
17 楼 Ashfrog 2010-09-03  
例子很浅显易懂,也很有趣···
但我还是没有理解到这种模式的妙处···
是不是可以这样理解···
由Boy,将Girl的方法组合封装,Friend就可以通过Boy的methodA,B(封装了Girl的方法),来实现功能,而不必直接调用Girl的方法···
16 楼 jeff.key 2010-08-31  
[quote=&quot;ysen&quot;]
老鸟飞过

一直觉得facade有点多余,
主要是处理一些legacy系统接口过于复杂需要重新包装的问题。
如是你的系统从一开始就facade,那就有点奇怪了。

facade的一个可以参考的应该我觉得是tomcat的代码,
忘了是哪一段了,具体grep一下facade就知道了。
15 楼 wa20463165 2010-08-26  
我感觉就像是工厂模式的扩展,以前咱们习惯一个工厂生产一种产品,现在这个工厂生产了多种不同用途的产品。
呵呵,也可能是我没看懂哈!
14 楼 ideal46 2010-08-18  
如果是为了纯粹的将facade模式,很好,但是这样的设计不好,不用接口的设计模式都是狗屎。
13 楼 lovelh 2010-08-11  
简单易懂,不错
12 楼 youanyyou 2010-05-27  

学习了。。。简单易懂
11 楼 zhglhy 2010-05-25  
很好,简单易懂!
10 楼 抢街饭 2010-05-18  
女友多 真是一件好事
9 楼 ahutzh 2010-05-17  
最近正在看设计模式有关的书籍,向楼主学习了!
8 楼 nenyalanye_1 2010-05-17  
methodA 和methodB 应该改为 私有访问更好吧
7 楼 fucktianya 2010-05-14  
讲的很一般,没看出哪儿好。
之所以这么说,是因为我没看懂,哈哈!
6 楼 nenyalanye_1 2010-05-12  
讲的不错 很好理解
5 楼 chendw_hz 2009-12-21  
我觉得楼主应该在门面类型对象用容器来容纳其他的子系统更好~!如果子对象如果特别多
估计提供给客户端的门面对象非常庞大 维护不方便,浅见。。
4 楼 LK.Bing 2009-12-11  
很好,简单易懂.
3 楼 java苹果+番茄 2009-12-10  
<div class="quote_title">ysen 写道</div>
<div class="quote_div">
<p>老鸟飞过</p>
<p> </p>
<p> </p>
<pre name="code" class="java">package facade;
/**
*
* 在实际的开发过程中,往往需要将不同的两个层分离,
* 比如mvc 三层架构
* 业务层与表现层、持久层与业务层之间建立外观Facade,
* 这样为新的系统提供简单的接口。
*/
//facade类 组合了 三个子系统(每个girl是独立的系统)
public class Boy {

private BeautifulGirl beautifulGirl;
private LivelyGirl  livelyGirl;
private LooksMediocreGirl looksMediocreGirl;

Boy(){
beautifulGirl = new BeautifulGirl();
livelyGirl =new LivelyGirl();
looksMediocreGirl = new LooksMediocreGirl();
}

//我的朋友并不知道我有几个女友,因为女友是我私有的,但是给我朋友做饭的不是我,却是我的女友们。
//我的朋友到我家做客,他不了解我们家的情况,如果让我的朋友直接命令我的女友做家务,也许他会忙的忘记和我讲正事了(违背了单一职责)
//我朋友 1————1 我(facade) 1————n girls
//如果没有了我(facade),那么就变成了 我朋友 1————n girls
//如果我朋友是待开发的新系统, girls是老系统(之前实现了的)
//新系统需要用到老的系统提供服务,可是老系统很复杂,
//开发新系统的人可能不了解老系统是怎么实现的,
//那么facade 的出现就是提供给新系统 老系统的接口
public void  dinner_for_friend(Friend friend){

// if...else...可以考虑状态模式重构
if(  friend.getAges()&lt;30){
this.methodA();
}else{
this.methodB();
}


}

public void methodA(){

beautifulGirl.do_it();
livelyGirl.do_something();
looksMediocreGirl.i_can_do();

}
public void methodB(){

looksMediocreGirl.i_can_do();
livelyGirl.do_something();
beautifulGirl.do_it();
}


}</pre>
<p> </p>
<pre name="code" class="java">public class BeautifulGirl {

public void do_it(){

System.out.println("来杯咖啡");
}

}
</pre>
<p> </p>
<pre name="code" class="java">public class LivelyGirl {


public void do_something(){

System.out.println("准备午餐");
}

}
</pre>
<p> </p>
<pre name="code" class="java">public class LooksMediocreGirl {

public void i_can_do(){

System.out.println("准备点心");

}

}
</pre>
<p> </p>
<p> </p>
<pre name="code" class="java">public class Friend {

int ages;


public int getAges() {
return ages;
}

public void setAges(int ages) {
this.ages = ages;
}



}
</pre>
<p> </p>
</div>
<p> </p>
2 楼 ysen 2009-12-10  
wujiazhao88 写道
楼主对设计模式的理解应用到这些有趣的例子上,真是不错

最近还是比较闲的,呵呵
1 楼 wujiazhao88 2009-12-10  
楼主对设计模式的理解应用到这些有趣的例子上,真是不错

相关推荐

Global site tag (gtag.js) - Google Analytics