门面模式

门面模式(Facade)也被称为正面模式、外观模式,这种模式用于将一组复杂的类包装到一个简单的外部接口中。

假设这样的场景:有一个顾客需要到饭店用餐,这就需要定义一个Customer类,并为该类定义一个haveDinner()方法。考虑饭店有三个部门:收银部、厨师部和服务生部,用户就餐需要这三个部门协调才能完成。UML类图如下。

门面模式_第1张图片

下面笔者给出实现的类。

定义一个Payment的接口。

 public interface Payment
{
	// 模拟顾客支付费用的方法
	String pay();
}

实现这个接口的PaymentImpl的类。

 public class PaymentImpl
	implements Payment
{
	// 实现模拟顾客支付费用的方法
	public String pay()
	{
		String food = "快餐";
		System.out.println("你已经向收银员支付了费用,您购买的食物是:"
			+ food);
		return food;
	}
}

定义一个Cook的接口。

  public interface Cook
{
	// 模拟烹调食物的方法
	String cook(String food);
}

实现这个接口的CookImpl类。

 public class CookImpl
	implements Cook
{
	// 实现模拟烹调食物的方法
	public String cook(String food)
	{
		System.out.println("厨师正在烹调:" + food);
		return food;
	}
}

定义个waiter的接口。

public interface Waiter
{
	// 模拟服务生上菜的方法
	void serve(String food);
}
 实现这个接口的WaitrerImpl的类。
  public class WaiterImpl
	implements Waiter
{
	// 模拟服务生上菜的方法
	public void serve(String food)
	{
		System.out.println("服务生已将" + food
			+ "端过来了,请慢用...");
	}
}
 为上面的Payment、Cook、Waiter三个部门提供一个门面(Facade),使用该Facede来包装这些类,对外提供一个简单的访问方法。
public class Facade
{
	// 定义被Facade封装的三个部门
	Payment pay;
	Cook cook;
	Waiter waiter;
	// 构造器
	public Facade()
	{
		this.pay = new PaymentImpl();
		this.cook = new CookImpl();
		this.waiter = new WaiterImpl();
	}
	public void serveFood()
	{
		// 依次调用三个部门的方法,封装成一个serveFood()方法
		String food = pay.pay();
		food = cook.cook(food);
		waiter.serve(food);
	}
}
 接下来Customer来调用 。

public class Customer
{
	public void haveDinner()
	{
		// 直接依赖于Facade类来实现用餐方法
		Facade f = new Facade();
		f.serveFood();
	}
	public static void main(String[] args)
	{
		new Customer().haveDinner();
	}
}

结果。





你可能感兴趣的:(java,设计模式,jsp,UML,Web应用)