设计模式----门面模式

门面模式是一个非常简单的模式,其核心含义就是外部程序调用子系统通过统一的接口就是门面而不是直接去使用子系统这样子系统的修改变更将不影响到外部程序,变得易于修改。


例如:

            我们在使用jdbc访问数据库时需要做获得连接等等一些操作这些每个方法都可以变为子系统如果没有一个统一的一个访问门面那么我们就需要每次都要建立连接等子系统都去调用,一旦一个子系统修改,所有的程序都必须跟着修改、这不符合我们面向对象的原则,程序变得不易修改。


门面模式的组成

1.门面角色:将子系统进行组合来提供给外部程序调用是门面系统的核心。

2.子系统角色:他就是一些系统的功能对外部程序并不公开,和门面程序也没有任何的联系。

3.客户程序:调用门面系统的角色。


我们通过餐厅这样一个简单的例子来演示一下门面角色,我们出去吃饭的时候有的餐厅是这样,自己跑到柜台去点单、点完单子在送给服务员、完了还要自己找座位,吃起饭来人少还好,人多那是非常恼火啊,这就是一个典型的不使用门面模式的效果,如果我们使用门面模式,进门服务员领着去座位,有服务员来点菜,你只需要坐在那里等一等别的全部搞定,那感受一定很不错.从这里我们也知道,设计模式不单单只能用在软件工程上哦。


/**
 * 
 */
package com.model.facade;

/**
 *************************************************************** 
 * 项目名称:DescignModel
 * 程序名称:Bar
 * 日期:2012-9-14 下午02:10:52
 * 作者:餐厅点餐柜台
 * 模块:
 * 描述:
 * 备注:
 * ------------------------------------------------------------
 * 修改历史
 * 序号  				日期        		修改人       修改原因
 * 
 * 修改备注:
 * @version 
 ***************************************************************
 */
public class Bar {
	
	public void getMenu(String str){
		System.out.println("顾客点了"+str);
	}
	
}


/**
 * 
 */
package com.model.facade;

/**
 *************************************************************** 
 * 项目名称:DescignModel
 * 程序名称:Consumer
 * 日期:2012-9-14 下午02:43:40
 * 作者:
 * 模块:
 * 描述:
 * 备注:
 * ------------------------------------------------------------
 * 修改历史
 * 序号  				日期        		修改人       修改原因
 * 
 * 修改备注:
 * @version 
 ***************************************************************
 */
public class Consumer {
	
	public static void main(String[] args){
		Waiter waiter = new Waiter();
		waiter.helpConsumer("麻婆豆腐");
	}
}

/**
 * 
 */
package com.model.facade;

import java.util.HashMap;
import java.util.Map;

/**
 *************************************************************** 
 * 项目名称:DescignModel
 * 程序名称:Seat
 * 日期:2012-9-14 下午02:13:40
 * 作者:
 * 模块:座位
 * 描述:
 * 备注:
 * ------------------------------------------------------------
 * 修改历史
 * 序号  				日期        		修改人       修改原因
 * 
 * 修改备注:
 * @version 
 ***************************************************************
 */
public class Seat {
	//这里本该有一个总的座位信息的既然是demo就不做了
	
	//这里用单例模式座位是一个店的共享资源嘛
	private static Map<Integer,Integer> seatMap = new HashMap<Integer, Integer>();
	
	private Seat(){
		
	}
	
	//获得座位情况
	public static Map<Integer, Integer> getSeatMap() {
		return seatMap;
	}
	
	//客人离开座位
	public static void setSeatMap(Integer seatNum) {
		seatMap.remove(seatNum);
	}
	
	//迎客
	public static void setSeatMap(Integer seatNum,Integer people) {
		System.out.println("顾客坐在了"+seatNum+",一共"+people+"位");
		seatMap.put(seatNum, people);
	}
	
}

/**
 * 
 */
package com.model.facade;

/**
 *************************************************************** 
 * 项目名称:DescignModel
 * 程序名称:Kitchen
 * 日期:2012-9-14 下午02:11:25
 * 作者:厨房
 * 模块:
 * 描述:
 * 备注:
 * ------------------------------------------------------------
 * 修改历史
 * 序号  				日期        		修改人       修改原因
 * 
 * 修改备注:
 * @version 
 ***************************************************************
 */
public class Kitchen {

	public void make(String str){
		System.out.println("开始做"+str);
		try {
			Thread.sleep(5000);
			System.out.println("做好了"+str);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
}

/**
 * 
 */
package com.model.facade;

/**
 *************************************************************** 
 * 项目名称:DescignModel
 * 程序名称:Waiter
 * 日期:2012-9-14 下午02:12:49
 * 作者:
 * 模块:服务员
 * 描述:
 * 备注:
 * ------------------------------------------------------------
 * 修改历史
 * 序号  				日期        		修改人       修改原因
 * 
 * 修改备注:
 * @version 
 ***************************************************************
 */
public class Waiter {
	
	public Waiter(){
		Seat.setSeatMap(1, 3);
	}
	
	public void helpConsumer(String str){
		Bar bar = new Bar();
		bar.getMenu(str);
		Kitchen kitchen = new Kitchen();
		kitchen.make(str);
		System.out.println("请慢用");
	}
}

门面模式的应用

1.为一个复杂的子系统提供一个简单地调用接口。

2.当客户程序与子程序依赖时可以加入门面简化以来。

3.当需要为子系统建立层次结构时,可以使用门面来为每个层次提供接口,子系统与子系统之间的如果有依赖也可以用门面模式来简化依赖。

优点

1.子系统对客户程序屏蔽。

2.子系统与客户程序为一个松耦合。

3.他并不强制不让客户程序直接使用子系统,客户程序可以再方便性和通用性之间选择调用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值