论坛首页 Java企业应用论坛

外观模式(Facade Pattern) 追MM

浏览 17606 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (6)
作者 正文
   发表时间:2009-02-12   最后修改:2009-02-18

外观模式:

定义:它为子系统中的一组接口提供一个统一的高层接口。是的子系统更容易使用。

 

有一天女朋友想要去一个地方旅游。。旅游需要考虑很多很多的问题。如旅游的地点,航班,宾馆,饭店。我把所有的这些问题都扔给她了。。。假设简化旅游的行程。需要完成的步骤有

  • 计划旅游景点
  • 预定宾馆
  • 预定机票
  • 飞往目的地
  • 入住宾馆
  • 吃饭
  • 游玩

首先把旅游作为一个子系统,子系统包含4个类 ,分别如下。

航班

package facade.demo;
/**
 * 航班
 * @author Nicholas
 *
 */
public class Flight {
	public void scheduled(){
		System.out.println("预定机票");
	}
	
	public void go(){
		System.out.println("飞往目的地");
	}
}

宾馆

package facade.demo;
/**
 * 宾馆
 * @author Nicholas
 *
 */
public class Hotel {
	public void booking(){
		System.out.println("预定宾馆");
	}
	
	public void check(){
		System.out.println("入住宾馆");
	}
}

 旅游景点

package facade.demo;
/**
 * 旅游景点
 * @author Nicholas
 *
 */
public class Place {
	public void plan(){
		System.out.println("计划旅游景点");
	}
	
	public void play(){
		System.out.println("游玩");
	}
}

 饭店

 

package facade.demo;
/**
 * 饭店
 * @author Nicholas
 *
 */
public class Restaurant {
	public void eating(){
		System.out.println("吃饭");
	}
}
 

好了。。旅游真是个麻烦事情,我还是把这些麻烦扔给女朋友吧。。

女朋友

package facade.demo;
/**
 * 我的女朋友
 * @author Nicholas
 *
 */
public class Mygirl1 {
	private Flight flight;
	private Hotel hotel;
	private Place place;
	private Restaurant restaurant;

	
	public Mygirl1(Flight flight, Hotel hotel, Place place, Restaurant restaurant) {
		this.flight = flight;
		this.hotel = hotel;
		this.place = place;
		this.restaurant = restaurant;
	}
	
	
	public void travel(){
		place.plan();
		hotel.booking();
		flight.scheduled();
		flight.go();
		hotel.check();
		restaurant.eating();
		place.play();
	}
	
	public static void main(String[] args){
		Flight flight = new Flight();
		Hotel hotel = new Hotel();
		Place place = new Place();
		Restaurant restaurant = new Restaurant();
		Mygirl1 mygirl = new Mygirl1(flight,hotel,place,restaurant);
		mygirl.travel();
		
	}
	
}

结果如下:

计划旅游景点
预定宾馆
预定机票
飞往目的地
入住宾馆
吃饭
游玩

 

 

以上都是我的想象了。。。女朋友就是上帝啊。。。。。哎。如果真的那样做。。估计女朋友非弄死我。。。

到这里我们发现了个问题。女朋友要旅游需要关心那么多问题。。这些对她来说太复杂了。。她并不关心细节。只要她答到旅游的目的就好了。。。这时候,解决麻烦的人出现了。。。对,那就好我,我就是那个所谓的"外观"。我来把这些问题解决掉,让她享受旅游的过程就好了。

package facade.demo;

/**
 * 我(我就是外观了)
 * @author Nicholas
 *
 */
public class ManFacade {
	private Flight flight;
	private Hotel hotel;
	private Place place;
	private Restaurant restaurant;

       public ManFacade(){     
              this.flight = new Flight();
		this.hotel = new Hotel();
		this.place = new Place();
		this.restaurant = new Restaurant();
       }

	public ManFacade(Flight flight, Hotel hotel, Place place, Restaurant restaurant) {
		this.flight = flight;
		this.hotel = hotel;
		this.place = place;
		this.restaurant = restaurant;
	}
	
	
	public void travel(){
		place.plan();
		hotel.booking();
		flight.scheduled();
		flight.go();
		hotel.check();
		restaurant.eating();
		place.play();
	}
}
 

看来麻烦解决掉了。女朋友很轻松的享受旅游过程了。。。。

package facade.demo;

/**
 * 女朋友
 * @author Nicholas
 *
 */
public class Mygirl {

	public static void main(String[] args){
		Restaurant restaurant = new Restaurant();
		ManFacade manFacade = new ManFacade();//我来解决掉这些麻烦。。。
		manFacade.travel();//旅游成功
	}
	
}

结果如下:

计划旅游景点
预定宾馆
预定机票
飞往目的地
入住宾馆
吃饭
游玩

 

本身外观模式的作用就是让接口更容易使用。真实的场景要复杂的多,这个例子只能提供个表面的意思。

总的来说,外观模式就是为了使接口更简单。。。

 

 

 

   发表时间:2009-02-12  
我觉的你没领会外观的真谛~ 或者说这个例子不咋地
0 请登录后投票
   发表时间:2009-02-12  
干嘛非要跟mm联系在一起?很有意思吗?
0 请登录后投票
   发表时间:2009-02-12  
娱乐一下么。呵呵。
0 请登录后投票
   发表时间:2009-02-13  
挺好的呀,sql语句的整合也是facade的一个例子,我想说楼主思维很活跃~真怀疑是不是搞开发的robot
0 请登录后投票
   发表时间:2009-02-13  
哈哈,就是没有明白为啥第一个例子里的mygirl 加了一个 1 。
0 请登录后投票
   发表时间:2009-02-13  
vvrao 写道
哈哈,就是没有明白为啥第一个例子里的mygirl 加了一个 1 。

估计是按键盘的时候手抖了一下
PS:怀疑楼主有女友恐惧症。
0 请登录后投票
   发表时间:2009-02-16  
HAO好例子 有意思
不过不要用女朋友吗欺负我们没得啊
0 请登录后投票
   发表时间:2009-02-16  
估计lz有很多个girls,

所以要编号,1,2,3,4,5,6,78。。。。。。。。。。
0 请登录后投票
   发表时间:2009-02-16   最后修改:2009-02-20
kimmking 写道
估计lz有很多个girls,

所以要编号,1,2,3,4,5,6,78。。。。。。。。。。

。。。。。。早知道用A,B,C,D,E了。。
0 请登录后投票
论坛首页 Java企业应用版

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