设计模式(三)—— 外观模式

一、定义

门面模式是一种封装性质的模式。提供了一个统一的接口,用来反问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

二、适用的场景

需要对一系列接口进行封装

三、模式中的角色

门面角色(Facade):调用子系统所有功能和责任
子系统角色(SubSystem):一个或多个接口

示意图

四、应用场景举例

案例一

假设我们现实生活中的一个场景,我们通常在网购之后需要去取快递。

这个过程又分为下面4个阶段:

1. 收到取快递的通知 ,里面的信息有圆通快递,取货号12
2. 走到取快递的店面
3. 报出取货号
4. 签字,拿到快递

我们要取快递就要知道这几个步骤,当我们取了几次快递后,可能就轻车熟路了,一句“老铁,帮我取个快递”,你就能轻松完成取快递的几个步骤,而不是一步一步地照着说明书来。简而言之,就是将步骤封装成一个取快递的指令。

改造前代码样例

Express接口

public interface IExpress {

	public void haveMessage(String message);
	
	public void moveShop();
	
	public void sayNumber(int num);
	
	public void signName(String name);
	
}

Express类

public class Express implements IExpress{

	@Override
	public void haveMessage(String message) {
		System.out.println("收到快递短信:"+message);
	}

	@Override
	public void moveShop() {
		System.out.println("走到快递店");
	}

	@Override
	public void sayNumber(int num) {
		System.out.println("报出号码:"+num);
	}

	@Override
	public void signName(String name) {
		System.out.println("收件人签字:"+name+",拿到快递");
	}
	

}

场景类

public class Client {

		public static void main(String[] args) {
			String message ="圆通快递,取货号12";
			int num = 12;
			String name = "bigboss";
			IExpress express  = new Express();
			express.haveMessage(message);
			express.moveShop();
			express.sayNumber(num);
			express.signName(name);
		}
}

改造后代码样例

对步骤进行封装

门面模式类

public class Facade {

	private IExpress express;
	
	public Facade(IExpress express){
		this.express = express;
	}
	
	public void getExpress(String message,int num,String name){
		express.haveMessage(message);
		express.moveShop();
		express.sayNumber(num);
		express.signName(name);
	}
	
}

场景类

public class Client {

		public static void main(String[] args) {
			String message ="圆通快递,取货号12";
			int num = 12;
			String name = "bigboss";
			IExpress express  = new Express();
			Facade facade = new Facade(express);
			facade.getExpress(message, num, name);
		}

		
}
posted @ 2016-04-29 16:33  清泉白石  阅读(293)  评论(0编辑  收藏  举报