linkin大话设计模式--门面模式
随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解。门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂化,有时候这种简化可能会降低了程序底层类的灵活性,但除了要求特别苛刻的客户端之外,他通常可以提供所需要的全部功能,当然这些苛刻的用户任然可以直接访问底层的类和方法。
简单来讲,门面模式就是将一组负责的类包装到一个简单的外部的接口中。外部与一个子系统的通信必须通过一个统一的门面对象进行。
门面模式涉及两个角色:
门面角色:客户端可以调用这个角色的方法。此角色知道子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。
子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。
在什么情况下使用门面模式???
1.
为一个复杂的子系统提供一个简单的接口
2.
引入门面模式可以将一个子系统与他的客户端以及其他的子系统分离,可以提高子系统的独立性和可移植性
3.
层次化结构,如果层与层之间是互相依赖的,那么引用门面模式可以向鼎他们仅仅通过门面进行通信,从而简化了层与层之间的依赖关系。
代码如下:
<strong><span style="font-size:14px;">//模拟客户端调用门面接口
public class Cutsomer {
public static void haveDinner(String food){
Facede Facede = new Facede();
Facede.serveFood(food);
}
public static void main(String[] args) {
Cutsomer.haveDinner("快餐");
}
}
//门面
class Facede{
//将一套逻辑封装到了一起
private Payment payment;
private Cook cook;
private Waiter waiter;
public Facede() {
super();
this.payment = new PaymentImpl();
this.cook = new CookImpl();
this.waiter = new WaiterImpl();
}
public void serveFood(String food){
payment.pay(food);
cook.cook(food);
waiter.serve(food);
}
}
//收银部接口
interface Payment{
public String pay(String food);
}
//厨师部门接口
interface Cook{
public String cook(String food);
}
//服务生部门
interface Waiter{
public void serve(String food);
}
class PaymentImpl implements Payment{
@Override
public String pay(String food) {
System.out.println("您已经交了钱了,你购买的事物是..."+food);
return food;
}
}
class CookImpl implements Cook{
@Override
public String cook(String food) {
System.out.println("厨师正在做饭呢..."+food);
return food;
}
}
class WaiterImpl implements Waiter{
@Override
public void serve(String food) {
System.out.println("服务员已经将..."+food+"端上来了,慢慢吃吧...");
}
}
</span></strong>