外观模式

摘要

  本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了外观模式的原理及应用。本文可帮助读者快速掌握外观模式,以便工作学习中使用外观模式。

一、外观模式

  在一家烧烤店中,有羊肉串、牛肉串、茄子,现来了三位顾客张三、李四、王五,他们的点餐各不相同,张三要5串羊肉串、10串牛肉串;李四要10串羊肉串、15串牛肉串、1个茄子;王五要5串羊肉串、2个茄子。将烧烤店的商品看成一个集合,把客户看成第二集合,由此可见两个集合之间的关系比较复杂和多变。
  在编程时,也会出现两个集合对象之间关系无规则且多变的情况。若在任一集合中添加一个对象,都会让两个集合之间的关系更为复杂,这样的代码不利于我们后期的维护和扩展。
  外观模式则是为这一问题提出了解决方案。在烧烤店中,我们加入一个服务员,让所有顾客向服务员点餐,同时食物也直接给服务员,这样关系网络不在是网状,而是“多 <——> 1 <——> 多”的关系,实现了食物与顾客之间的解耦。在两个集合对象中,可以在中间加入一个“服务”对象即可,让两个集合都通过服务对象与另一个集合发生关系,这样就会改善网状关系。

二、外观模式的实现

2.1 场景设计

   KFC中有薯条、炸鸡、汉堡、可乐、果汁,顾客可以通过前台服务员进行点餐。

2.2 代码实现

2.2.1 Facade 服务员角色

package ft.patterns.facade;

public class Facade {
	private Chips chips;
	private Hamburger hamburger;
	private FriedChicken friedChicken;
	private FruitJuice fruitJuice;
	private Cola cola;
	
	public Facade(Chips chips, Hamburger hamburger, FriedChicken friedChicken, FruitJuice fruitJuice, Cola cola) {
		this.chips = chips;
		this.hamburger = hamburger;
		this.friedChicken = friedChicken;
		this.fruitJuice = fruitJuice;
		this.cola = cola;
	}
	
	public void packageA() {
		chips.cookingChips();
		friedChicken.cookingFriedChicken();
		System.out.println("PackageA is complete.");
	}
	
	public void packageB() {
		chips.cookingChips();
		friedChicken.cookingFriedChicken();
		cola.cookingCola();
		System.out.println("PackageB is complete.");
	}
	
	public void packageC() {
		hamburger.cookingHamburger();
		friedChicken.cookingFriedChicken();
		fruitJuice.cookingFruitJuice();
		System.out.println("PackageC is complete.");
	}
}

2.2.2 Chips 薯条

package ft.patterns.facade;

public class Chips {
	public void cookingChips() {
		System.out.println("It is cooking Chips.");
	}
}

2.2.3 FriedChicken 炸鸡

package ft.patterns.facade;

public class FriedChicken {
	public void cookingFriedChicken() {
		System.out.println("It is cooking FriedChicken.");
	}
}

2.2.4 Hamburger 汉堡

package ft.patterns.facade;

public class Hamburger {
	public void cookingHamburger() {
		System.out.println("It is cooking Hamburger.");
	}
}

2.2.5 Cola 可乐

package ft.patterns.facade;

public class Cola {
	public void cookingCola() {
		System.out.println("It is cooking Cola.");
	}
}

2.2.6 FruitJuice 果汁

package ft.patterns.facade;

public class FruitJuice {
	public void cookingFruitJuice() {
		System.out.println("It is cooking FruitJuice.");
	}
}

2.2.7 Main 测试类

package ft.patterns.facade;

public class Main {
	public static void main(String[] args) {
		Chips chips = new Chips();
		Hamburger hamburger = new Hamburger();
		FriedChicken friedChicken = new FriedChicken();
		FruitJuice fruitJuice = new FruitJuice();
		Cola cola = new Cola();
		
		Facade kfcFacade = new Facade(chips, hamburger, friedChicken, fruitJuice, cola);
		kfcFacade.packageA();
		System.out.println();
		kfcFacade.packageB();
		System.out.println();
		kfcFacade.packageC();
	}
}

2.2.8 测试结果

It is cooking Hamburger.
It is cooking FriedChicken.
It is cooking FruitJuice.
PackageC is complete.

三、外观模式的UML图

外观模式UML类图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值