大话设计模式-Java实现(12)-外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

举例:
现在很多人都喜欢点外卖,点外卖的流程很简单,你只需要选择了想吃的东西,然后等着外卖小哥送货上门就可以了,至于外卖软件怎么通知店家,中间店家怎么做菜,做完后怎么分配骑手的过程都不需要你操心,这个流程就可以用外观模式来实现。

//饭店类
public class Restaurant {
	
	public void receiveOrder(){
		System.out.println("饭店接收外卖订单,通知厨师制作");
	}
	
}
//厨师类
public class Chef {
	
	public void cook(){
		System.out.println("厨师开始制作午餐,通知骑手准备取货");
	}
	
}
//快递骑手类
public class Courier {
	
	public void transport() {
		System.out.println("骑手小哥准备取货配送");
	}
	
}
//门面类
public class Lunch {
	
	private Restaurant restaurant;
	private Chef chef;
	private Courier courier;

	public Lunch() {
		this.restaurant = new Restaurant();
		this.chef = new Chef();
		this.courier = new Courier();
	}

	public void orderLunch(){
		// 点外卖后,外卖软件通知商家接单
		restaurant.receiveOrder();
		// 商家接单后,通知厨师开始制作午餐
		chef.cook();
		// 骑手准备去商家取货配送
		courier.transport();
	}
	
}
//主程序代码
public class Test {
	
    public static void main(String[] args) {
        System.out.println("=== 饿了,点个外卖吧 ===");
        Lunch lunch = new Lunch();
        lunch.orderLunch();
        System.out.println("=== 收到外卖,可以开始吃了 ===");
    }
    
}

其实在开发当中,我们建立的Controller层、Service层、Dao层都用到了这个概念,比如符合MVC设计规范的工程中,当一个请求到达Controller层后,通常都会直接交给Service层去处理,Controller层并不用关注业务逻辑是如何实现的,只需要等Service层处理完后,得到一个结果就可以了,具体的实现由Service层在内部自己处理,这个Service层就相当于外观模式中的外观类,也叫门面类。

总结:

  • 在设计阶段,应该有意识的将不同的层分离,比如经典的三层架构,在层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。
  • 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,而增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。
  • 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,这时可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
发布了75 篇原创文章 · 获赞 58 · 访问量 3266

猜你喜欢

转载自blog.csdn.net/qq_44458489/article/details/105025318