`
风雪涟漪
  • 浏览: 508559 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9067
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18476
社区版块
存档分类
最新评论

外观模式(Facade Pattern) 追MM

阅读更多

外观模式:

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

 

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

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

首先把旅游作为一个子系统,子系统包含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();//旅游成功
	}
	
}

结果如下:

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

 

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

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

 

 

 

分享到:
评论
32 楼 jansel 2009-04-22  
这个就是简单的委托而已,或者就是把一系列的方法集中调用,很普通的用法,这个可不能称作 Facade 模式 Facade主要是简化下面子系统的接口繁琐,而在上层过滤了一把,是让别人看到有用的接口.

如果理解有问题,欢迎拍板
31 楼 zhuxing 2009-03-24  
你的例子有点问题^_^
30 楼 fmjasper 2009-03-24  
fa·çade also fa·cade  (f-säd)
n.
1. The face of a building, especially the principal face.
2. An artificial or deceptive front: ideological slogans that were a façade for geopolitical power struggles.

facade就是脸, 理解模式就是理解怎么用, 模式的定义通常都是比较模糊的, 上升到抽象层次, 模式就是类关系。 个人认为, facade, 说白了就是接口的统一。
29 楼 tvjody 2009-03-24  
外观模式符合:少用继承多用组合的原则,
描述的到是很清楚的,你把事都搞定了,你女朋友只要找到你就能轻松旅游.
但例子还可以再深入,现在感觉就是对象组合.
28 楼 mingweizheng 2009-03-19  
LZ。这样的东西也拿出来。浪费我时间
27 楼 mooniscrazy 2009-03-18  
这样学模式肯定是学不会的。
26 楼 lovu 2009-03-18  
我觉得你的那个女朋友类直接放一个你的引用,这就好比,你会给你女朋友安排所有的东西...不像外观模式。...
25 楼 lovu 2009-03-18  
不解的是MyGirl类main中的Restaurant restaurant = new Restaurant(); 
24 楼 val831201 2009-02-25  
看不懂哦...
23 楼 launchin 2009-02-23  
facade本身用"外观"来表达就貌似有点词不达意.不过搂住这个例子我感觉不适合用来演示facade,倒是适合表达composite(没拼错吧?)。

通常,众多功能相似/相同的接口有终端的具体实现对象,使用使用接口的时候,往往需要创建具体实现对象的实例,这样就暴露了细粒度的内部实现,facade针对这种问题,提供统一的访问方式,避免或者减少使用者访问实现对象。

其实facade用字面意义“消逝”也挺合适,就是窄化。

22 楼 xingqiliudehuanghun 2009-02-20  
这个例子没看的不是太懂。按我的理解好像外观模式是用来处理这样一个问题。一个操作需要由多个步骤来完成,这些步骤可能彼此联系。这个模式的有点就是把麻烦留给自己把方便留给使用者。但是我比较疑惑的是:一个操作流程一旦确定他所需要的信息也基本固定,即使你再怎么封装一些必须的信息也是不可少的,就按你的例子中两个人要旅游你总要告诉一下你想去哪这些东西,而你的例子中一个男朋友的facade就都搞定了。如果不把
这些数据以来关系是怎么解决的说清楚我感觉这个模式跟简单的封装没有区别。
     新学Java没多久,可能问题比较幼稚,希望大家别见笑
21 楼 shenglongq 2009-02-20  
wdlfellow 写道
挺好的呀,sql语句的整合也是facade的一个例子,我想说楼主思维很活跃~真怀疑是不是搞开发的robot



对这个sql语句的整合的facade比较感兴趣,不知道能否交流下?
20 楼 airport 2009-02-20  
不像模式。
19 楼 _咖啡杯垫 2009-02-20  
风雪涟漪 写道
kimmking 写道
估计lz有很多个girls,

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

。。。。。。早知道用A,B,C,D,E了。。。。这样最多才24个。呵呵


估计到时候手又会抖,出个girlA1。。。一组合,不知道有多少了。


18 楼 风雪涟漪 2009-02-20  
xyf_84 写道
一看开头那个类就设计不合理,下面的就不用看了.

你说的我明白了,但是大家明白了么。我不知道,问题我自己也清楚,有空把例子在优化优化。
17 楼 xyf_84 2009-02-20  
一看开头那个类就设计不合理,下面的就不用看了.
16 楼 ibio 2009-02-18  
有意思,LZ你太有才了。联系上女朋友这么敏感的词汇。呵呵!~
15 楼 didiluck 2009-02-18  
我觉得只要最后那段代码就OK了.或者说,你其实需要的是一个旅游公司.呵呵.
14 楼 lujiawu12 2009-02-18  
粗俗见解是就是和DEMO差不多的东西,可以再复用
13 楼 风雪涟漪 2009-02-18  
TaoistWar 写道
wdlfellow 写道
#  public ManFacade(){      
#                 Flight flight = new Flight(); 
#         Hotel hotel = new Hotel(); 
#         Place place = new Place(); 
#         Restaurant restaurant = new Restaurant(); 
#        } 

写错了吧!

对,果然错误。不好意思。呵呵

相关推荐

    设计模式之外观模式(Facade Pattern)

    **外观模式(Facade Pattern)**是一种结构型设计模式,它主要解决的是复杂系统或子系统对外暴露一个简单统一的接口,使得客户端无需关心内部复杂的交互细节。这种模式在实际开发中广泛应用,尤其在大型项目中,它能...

    外观模式(Facade Pattern)-结构型模式

    设计模式面面观(13):外观模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/17/2299641.aspx

    外观模式 Facade Pattern

    ### 外观模式 (Facade Pattern) #### 概述 外观模式是一种重要的设计模式,属于结构型模式之一。其核心在于通过引入一个简单的接口来隐藏一个系统中存在的复杂性,从而简化了客户端对该系统的使用。该模式的主要...

    c++-设计模式之外观模式(Facade Pattern)

    外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂子系统提供一个简单的接口。它通过封装系统内部的复杂性,提供一个统一的接口,使得客户端能够更加方便地使用子系统的功能。这种模式通常用于简化代码、...

    通过python实现外观模式(Facade Pattern).rar

    外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。外观模式定义了一个高层接口,使得这一子系统更加容易使用。 压缩包文件代码是一个简单的 ...

    通过C++实现外观模式(Facade Pattern).rar

    在C++中,外观模式(Facade Pattern)同样用于为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。压缩包文件代码是一个简单的C++实现外观模式的示例。 1、定义各个子系统的类及其接口。 2、定义外观类...

    通过java实现外观模式(Facade Pattern).rar

    在Java中,外观模式(Facade Pattern)同样用于为子系统中的一组接口提供一个统一的接口,使得子系统更容易使用。压缩包文件代码是一个使用Java实现外观模式的简单示例。 1、定义各个子系统的接口及其实现类。 2、...

    设计模式之外观模式 facade

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,主要目的是为了解决复杂的系统接口问题,提供一个简单的统一入口,使得客户端可以更方便地使用系统。在Java中,外观模式通常用来隐藏系统的复杂性,对外只...

    解析C#设计模式编程中外观模式Facade Pattern的应用

    外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了简化客户端与复杂系统之间的交互。在C#编程中,外观模式通常用于减少客户端对子系统组件的依赖,提供一个统一的、高层次的接口,使得...

    设计模式 之 “门面模式[Facade Pattern]”

    门面模式(Facade Pattern)是软件工程中一种常用的结构型设计模式,它的主要目的是提供一个统一的接口,用来简化系统中一组复杂的接口或类的使用。这个模式将复杂的子系统接口封装在一个简单的门面对象中,使得...

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/25/2326692.aspx

    FacadePattern.unitypackage

    FacadePattern.unitypackage是C#版设计模式中的外观模式,采用unity举例和C#举例,详细说明了外观模式的用法。

    外观模式facade

    外观模式(Facade)是设计模式中的一种结构型模式,它为复杂的系统或子系统提供了一个统一的入口点,简化了客户端与系统之间的交互。通过外观模式,我们可以将系统的内部复杂性隐藏起来,使得用户只需要与一个简单的...

    Wrapper facade pattern

    **包装器外观模式(Wrapper Facade Pattern)** 包装器外观模式是一种软件设计模式,它将一个复杂的组件或者一组组件的接口进行简化,提供一个统一的、更易用的访问方式。这种模式通常用于隐藏底层系统的复杂性,为...

    C#面向对象设计模式纵横谈\11 结构型模式Facade外观模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第11节:结构型模式Facade外观模式

    PHP设计模式(九)外观模式Facade实例详解【结构型】

    【外观模式(Facade)详解】 外观模式是一种结构型设计模式,其主要目的是为了解决复杂的系统划分成多个子系统后,如何降低子系统间的耦合度,提高系统的可维护性和可扩展性。它通过提供一个统一的接口,使得外部...

    C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式) (Level 300)

    **外观模式(Facade Pattern)**是面向对象设计模式中的一种结构型模式,它提供了一个统一的接口,用于访问子系统中的各个部分。在C#编程中,外观模式可以帮助我们简化复杂的系统接口,使得客户端代码与复杂的内部...

    java 设计模式 Facade外观模式 Simple Factory 简单工厂模式

    外观模式是一种结构型设计模式,它的主要目标是提供一个统一的接口,用来简化对复杂系统的访问。在Java中,当你有一个复杂的子系统,而你希望客户端代码能够以一种更简洁、更易于理解的方式来与之交互时,就可以使用...

Global site tag (gtag.js) - Google Analytics