介绍
外观模式就像是一家快餐店的服务员。当你去快餐店点餐时,服务员会告诉你今天的特色菜、套餐、饮料等等,然后你只需要告诉服务员你想要什么,服务员就会帮你把所有食物和饮料都准备好,最后一起送到你的桌子上。
在这个例子中,服务员就是外观模式,他隐藏了所有的复杂操作和细节,只提供了一个简单的接口,让顾客可以轻松地点餐。同样地,外观模式也隐藏了系统的复杂性,提供了一个简单的接口,让客户端可以方便地使用系统中的功能。
概述
外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。通过在外观类中定义一个高层接口,外观模式隐藏了子系统的复杂性,并将客户端与子系统的内部逻辑解耦。
示例一
以快餐店服务员为例。
首先,创建一些子系统类,模拟快餐店的各种食物和饮料:
// 子系统类 - 汉堡
class Hamburger {
public void prepareHamburger() {
System.out.println("准备汉堡");
}
}
// 子系统类 - 可乐
class Cola {
public void prepareCola() {
System.out.println("准备可乐");
}
}
// 子系统类 - 薯条
class FrenchFries {
public void prepareFrenchFries() {
System.out.println("准备薯条");
}
}
然后,创建外观类 Waiter
,作为服务员的角色,提供简单的接口给顾客点餐:
// 外观类 - 服务员
class Waiter {
private Hamburger hamburger;
private Cola cola;
private FrenchFries frenchFries;
public Waiter() {
hamburger = new Hamburger();
cola = new Cola();
frenchFries = new FrenchFries();
}
public void takeOrder() {
hamburger.prepareHamburger();
cola.prepareCola();
frenchFries.prepareFrenchFries();
System.out.println("所有食物和饮料已准备好");
}
}
测试:
public class Client {
public static void main(String[] args) {
Waiter waiter = new Waiter();
waiter.takeOrder();
}
}
运行结果:
准备汉堡
准备可乐
准备薯条
所有食物和饮料已准备好
示例二
一个常见的实际应用场景是购物平台。假设你正在开发一个电子商务平台,需要提供一个统一的购物接口,包括添加商品到购物车、生成订单、支付等操作。你可以使用外观模式来封装底层的购物逻辑,以提供一个简单的购物接口给客户端使用。
以下是一个示例代码:
class ShoppingCart {
public void addProduct(String productId) {
System.out.println("添加商品到购物车:" + productId);
}
public void generateOrder() {
System.out.println("生成订单");
}
public void payOrder(String orderId) {
System.out.println("支付订单:" + orderId);
}
}
class ShoppingFacade {
private ShoppingCart shoppingCart;
public ShoppingFacade() {
this.shoppingCart = new ShoppingCart();
}
public void addToCart(String productId) {
shoppingCart.addProduct(productId);
}
public void checkout() {
shoppingCart.generateOrder();
}
public void pay(String orderId) {
shoppingCart.payOrder(orderId);
}
}
public class Main {
public static void main(String[] args) {
ShoppingFacade shoppingFacade = new ShoppingFacade();
shoppingFacade.addToCart("P001");
shoppingFacade.addToCart("P002");
shoppingFacade.checkout();
shoppingFacade.pay("O001");
}
}
输出结果:
添加商品到购物车:P001
添加商品到购物车:P002
生成订单
支付订单:O001