网站主页如何配色,济南网站建设制作设计,软件开发如何定价,app手机程序开发目录导航 什么是外观模式现实生活类比实战示例门面模式的好处门面模式源码举例 什么是外观模式
外观模式的英文名是Facade#xff0c;意思是the front of a building#xff0c;即建筑物的正面#xff08;门面#xff09;#xff0c;我个人更喜欢翻译成门面模式。门面模式… 目录导航 什么是外观模式现实生活类比实战示例门面模式的好处门面模式源码举例 什么是外观模式
外观模式的英文名是Facade意思是the front of a building即建筑物的正面门面我个人更喜欢翻译成门面模式。门面模式是一种结构型设计模式所谓结构型是指在代码结构设计方面的设计模式。
门面模式是一个类或一个模块统一的功能入口屏蔽掉系统内部的实现及运作方式客户端通过门面与系统交互大大降低使用的复杂度减少与系统的耦合。
现实生活类比
在一家餐馆中顾客可能需要各种服务。如点餐、买单、询问卫生间、需要卫生纸、临时添加碗筷等等。如果每种服务都要到餐馆不同的服务点找不同的人解决顾客会疯掉。而前台就是整个餐馆的门面是餐馆所有功能的输出口顾客通过前台与餐馆沟通享受各种服务而不用关心前台将会对此事如何安排具体指派何人以何种方式满足顾客要求等。
实战示例
假如我们要开发上述的餐馆功能。 初始阶段业务相对简单我们只有点餐与买单的功能。新建一个OrderManager类
public class OrderManager {//点餐public void order(int tableNo) {System.out.println(table tableNo has ordered);}//买单public void bill(int tableNo, double dollars) {System.out.println(table tableNo bill: dollars);}
}调用方使用该功能 public static void main(String[] args) {//创建订单管理模块OrderManager orderManager new OrderManager();//下单orderManager.order(001);//结账orderManager.bill(001, 350.00);}随着业务迭代我们又提供了一些询问服务置于QueryService中
public class QueryService {//卫生间在哪里public String whereToilet(){return its xxxxx;}//...
}随着业务的复杂我们不断加入新的功能置于新的模块。对于餐馆功能的使用方来说需要记住每个功能模块对应的类使用复杂度不断攀升。 public static void main(String[] args) {//创建订单管理模块OrderManager orderManager new OrderManager();//下单orderManager.order(001);//结账orderManager.bill(001, 350.00);//创建服务问询模块QueryService queryService new QueryService();//询问厕所queryService.whereToilet();//...}我们使用门面模式可以解决上述问题。首先我们创建一个门面类——RestaurantFacade, 此类作为整个餐馆功能入口。
public class RestaurantFacade {private OrderManager orderManager new OrderManager();private QueryService queryService new QueryService();//...public OrderManager orderService() {return orderManager;}public QueryService queryService() {return queryService;}//...
}对于调用方来说所有的功能我都通过RestaurantFacade一个类获取不关心也没必要知道其内部的实现和运作方式。 不管该系统后续添加新功能还是删除了旧功能交互门面不变。 public static void main(String[] args) {//创建门面类RestaurantFacade facade new RestaurantFacade();//下单facade.orderService().order(001);//结账facade.orderService().bill(001, 350.00);//询问厕所facade.queryService().whereToilet();//...}在这里为了进一步方便管理我们RestaurantFacade对外提供的功能是返回子模块然后子模块再调用具体功能。这种通常是在业务十分庞大复杂的情况下采取的策略。你也可以直接对外提供具体的功能而把模块信息封装在门面类内部。 以点餐为例
public class RestaurantFacade {private OrderManager orderManager new OrderManager();//...public void order(String tableNo) {orderManager.order(tableNo);}//...
}调用方代码 public static void main(String[] args) {//创建门面类RestaurantFacade facade new RestaurantFacade();//下单facade.order(001);//...}门面模式的好处
外观模式是一种设计模式旨在简化复杂系统的接口提供一个更简单的接口来访问系统的子系统集合。它通过将系统的复杂性隐藏在一个单一的接口背后使得客户端代码更容易使用。以下是外观模式的几个好处 简化接口: 外观模式提供了一个简化的接口使得客户端不需要了解系统的复杂性和内部工作原理只需与外观对象进行交互即可。 降低耦合性: 外观模式有助于降低系统中各个子系统之间的耦合度因为客户端只需与外观对象交互而不需要直接与子系统交互从而减少了对子系统的依赖性。 隐藏实现细节: 外观模式将系统的内部实现细节隐藏在外部使得系统更易于维护和修改。如果系统的内部实现发生变化只需更新外观类而不影响客户端代码。 提高易用性: 外观模式使得客户端代码更易于理解和使用因为它提供了一个简单的接口来访问复杂系统的功能而无需了解系统的内部复杂性。 促进代码组织和管理: 外观模式可以帮助将系统分解为更小的模块并将这些模块组织成更易于管理和维护的结构。
总的来说外观模式通过简化接口、降低耦合性、隐藏实现细节、提高易用性以及促进代码组织和管理等方面可以帮助提高系统的可维护性、可扩展性和可重用性。
门面模式源码举例
门面模式在第三方类库中非常常见。例如Okhttp我们使用它的功能基本都是通过OkHttpClient这个类。 //创建门面对象并进行配置OkHttpClient okHttpClient new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)//链接超时为2秒单位为秒.writeTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS)//读取超时.build();//执行一个请求 okHttpClient.newCall(new Request.Builder().url(xxxx).build()).execute();