了解设计模式 之 结构模式(五) -- 外观模式

本文阐述了外观模式在简化复杂系统接口上的应用,通过创建一个统一的接口,将多个子系统整合为单一的访问入口,减少客户端与复杂系统的交互复杂度。以方便面生产为例,展示了如何使用外观模式封装子系统,简化生产流程,提高代码可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
5. 外观模式(Facade Pattern)

外观模式在结构上并不复杂,就是给内部的子系统提供一个统一的接口,来举一个现实点的例子。

还是举方便面厂的例子吧(其实我不喜欢吃方便面的)。方便面的生产流程是很复杂的,包括和面机去和面,面饼要压片,蒸熟,然后是切割面饼,然后油炸,之后是冷却,然后加入调料包等等自动包装。这个过程如果用Java语言描述的话是很复杂的,会包括很多类和方法。就上边所说的过程而言,包括的类有:MixingMachine(和面机),RollingMachine(压片机),CookingMachine(蒸熟机),CuttingMachine(切割面饼机),FryingMachine(油炸机),CoolingMachine(冷却机),PackingMachine(自动包装机)。这样,当客户端要调用这些机器去生产方便面的时候,代码应该是类似这样的:

Java代码 复制代码  收藏代码
  1. public class Client {   
  2.   
  3.     public static void main(String[] args) {   
  4.         // 生产方便面所用的机器对象的初始化   
  5.   
  6.         // 和面   
  7.         mixingMachine.mix();   
  8.         // 压片   
  9.         rollingMachine.roll();   
  10.         // 蒸熟   
  11.         cookingMachine.cook();   
  12.         // 切割面饼   
  13.         cuttingMachine.cut();   
  14.         // 油炸   
  15.         fryingMachine.fry();   
  16.         // 冷却   
  17.         coolingMachine.cool();   
  18.         // 自动包装   
  19.         packingMachine.pack();   
  20.   
  21.     }   
  22.   
  23. }  
	public class Client {

		public static void main(String[] args) {
			// 生产方便面所用的机器对象的初始化

			// 和面
			mixingMachine.mix();
			// 压片
			rollingMachine.roll();
			// 蒸熟
			cookingMachine.cook();
			// 切割面饼
			cuttingMachine.cut();
			// 油炸
			fryingMachine.fry();
			// 冷却
			coolingMachine.cool();
			// 自动包装
			packingMachine.pack();

		}

	}


那么每生产一袋方便面都要重复这样一个复杂的过程,这个时候,可以使用外观模式来简化这个过程,首先定义一个外观类:

Java代码 复制代码  收藏代码
  1. public class InstantNoodleFacade {   
  2.     private MixingMachine mixingMachine;   
  3.     private RollingMachine rollingMachine;   
  4.     private CookingMachine cookingMachine;   
  5.     private CuttingMachine cuttingMachine;   
  6.     private FryingMachine fryingMachine;   
  7.     private CoolingMachine coolingMachine;   
  8.     private PackingMachine packingMachine;   
  9.   
  10.     public InstantNoodleFacade(MixingMachine mixingMachine, RollingMachine rollingMachine,   
  11.             CookingMachine cookingMachine, CuttingMachine cuttingMachine,   
  12.             FryingMachine fryingMachine, CoolingMachine coolingMachine,   
  13.             PackingMachine packingMachine) {   
  14.         this.mixingMachine = mixingMachine;   
  15.         this.rollingMachine = rollingMachine;   
  16.         this.cookingMachine = cookingMachine;   
  17.         this.cuttingMachine = cuttingMachine;   
  18.         this.fryingMachine = fryingMachine;   
  19.         this.coolingMachine = coolingMachine;   
  20.         this.packingMachine = packingMachine;   
  21.     }   
  22.   
  23.     public void makeInstantNoodle() {   
  24.         // 和面   
  25.         mixingMachine.mix();   
  26.         // 压片   
  27.         rollingMachine.roll();   
  28.         // 蒸熟   
  29.         cookingMachine.cook();   
  30.         // 切割面饼   
  31.         cuttingMachine.cut();   
  32.         // 油炸   
  33.         fryingMachine.fry();   
  34.         // 冷却   
  35.         coolingMachine.cool();   
  36.         // 自动包装   
  37.         packingMachine.pack();   
  38.     }   
  39. }  
	public class InstantNoodleFacade {
		private MixingMachine mixingMachine;
		private RollingMachine rollingMachine;
		private CookingMachine cookingMachine;
		private CuttingMachine cuttingMachine;
		private FryingMachine fryingMachine;
		private CoolingMachine coolingMachine;
		private PackingMachine packingMachine;

		public InstantNoodleFacade(MixingMachine mixingMachine, RollingMachine rollingMachine,
				CookingMachine cookingMachine, CuttingMachine cuttingMachine,
				FryingMachine fryingMachine, CoolingMachine coolingMachine,
				PackingMachine packingMachine) {
			this.mixingMachine = mixingMachine;
			this.rollingMachine = rollingMachine;
			this.cookingMachine = cookingMachine;
			this.cuttingMachine = cuttingMachine;
			this.fryingMachine = fryingMachine;
			this.coolingMachine = coolingMachine;
			this.packingMachine = packingMachine;
		}

		public void makeInstantNoodle() {
			// 和面
			mixingMachine.mix();
			// 压片
			rollingMachine.roll();
			// 蒸熟
			cookingMachine.cook();
			// 切割面饼
			cuttingMachine.cut();
			// 油炸
			fryingMachine.fry();
			// 冷却
			coolingMachine.cool();
			// 自动包装
			packingMachine.pack();
		}
	}


这个Facade对每个机器的动作进行了封装,并提供了统一的接口#makeInstantNoodle()来实现方便面的生产。

下面来看一下是用了Facade的客户端代码:

Java代码 复制代码  收藏代码
  1. public class Client {   
  2.   
  3.     public static void main(String[] args) {   
  4.         // 生产方便面所用的机器对象的初始化   
  5.            
  6.         InstantNoodleFacade facade = new InstantNoodleFacade(......);   
  7.         facade.makeInstantNoodle();   
  8.   
  9.     }   
  10.   
  11. }  
	public class Client {

		public static void main(String[] args) {
			// 生产方便面所用的机器对象的初始化
			
			InstantNoodleFacade facade = new InstantNoodleFacade(......);
			facade.makeInstantNoodle();

		}

	}


这样,就通过外观模式实现了一个简单的用户视图,实现了复杂子系统的简化。

除此之外,还可以在子系统和客户端之间加入一个Facade来解耦,让子系统拥有更好的独立性和可移植性,并且可以简化它们之间的依赖。

最后给出外观模式的类图:

  • 大小: 11.1 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值