目录
6、门面模式 6.1 介绍 6.2 一键操作 6.3 亲自下厨的烦扰 6.4 化繁为简 6.5 整合共享 6.6 门面模式的各角色定义
6、门面模式
6.1 介绍
门面模式(Facade)可能是最简单的结构型设计模式 它能将多个不同的子系统接口封装起来,并对外提供统一的高层接口 ,使复杂的子系统变得更易使用 无论是“门”还是“面”,指代的都是某系统的外观部分,也就是与外界接触的临界面或接口,所以门面模式常常也被翻译为“外观模式” 测试类文件
6.2 一键操作
如相机使用对焦、调节闪光灯、调光圈等 对庞大复杂的子系统进行了二次封装,把原本复杂的操作接口全都隐藏起来,并在内部加入逻辑 最终只为外界提供一个简单方便的快门按键,让用户能够“一键操作”
6.3 亲自下厨的烦扰
门面模式,那么以“商铺门面”的例子进行代码实战 亲自下厨需要买菜、洗菜、切菜,然后进行蒸、煮、炒、炸等烹饪过程,最后清理碗筷等 将步骤简化为以下3步,首先小明找菜贩买菜,然后找妹妹做菜,最后亲自洗碗
第1步: 定义蔬菜商类 第2步: 让妹妹作为厨房小能手类 第3步: 最后小明作为客户端类进行全局操控并
package facade. base ;
public class VegVendor {
public void purchase ( ) {
System . out. println ( "供应蔬菜……" ) ;
}
}
package facade. base ;
public class Helper {
public void cook ( ) {
System . out. println ( "做饭……" ) ;
}
}
package facade. base ;
public class Client {
public static void main ( String [ ] args) {
VegVendor vegVendor = new VegVendor ( ) ;
vegVendor. purchase ( ) ;
Helper helper = new Helper ( ) ;
helper. cook ( ) ;
Client client = new Client ( ) ;
client. eat ( ) ;
client. wash ( ) ;
}
public void eat ( ) {
System . out. println ( "开始吃饭......" ) ;
}
public void wash ( ) {
System . out. println ( "洗碗......." ) ;
}
}
一系列复杂的操作过程并不像我们想象的那么简单 不但惊扰四方,还要自己亲自擦桌洗碗,但无论换作谁都要经历这一番操作
6.4 化繁为简
门店(饭店)为了达到高效、便捷的目的,门店会统一对子系统进行整合与调度 ,至于它对蔬菜商、厨师或服务员等子系统是如何操作的,用户都不必了解 子系统
package facade. facade. entity ;
public class VegVendor {
public void purchase ( ) {
System . out. println ( "供应蔬菜……" ) ;
}
}
package facade. facade. entity ;
public class Chef {
public void cook ( ) {
System . out. println ( "厨师做饭......" ) ;
}
}
package facade. facade. entity ;
public class Waiter {
public void order ( ) {
System . out. println ( "接待,入座,点菜......" ) ;
}
public void serve ( ) {
System . out. println ( "服务员上菜......" ) ;
}
}
package facade. facade. entity ;
public class Cleaner {
public void clean ( ) {
System . out. println ( "清洁收拾桌子......" ) ;
}
public void wash ( ) {
System . out. println ( "清洁洗碗......" ) ;
}
}
外观门面类Facade:
内部封装了大量的子系统资源, 如蔬菜商、厨师、服务员、洗碗工 构造方法中依次对各个子系统进行了初始化操作 点菜方法order()中进行依次调度
package facade. facade ;
import facade. base. VegVendor ;
import facade. facade. entity. Chef ;
import facade. facade. entity. Cleaner ;
import facade. facade. entity. Waiter ;
public class Facade {
private VegVendor vegVendor;
private Chef chef;
private Waiter wait;
private Cleaner clean;
public Facade ( ) {
this . vegVendor = new VegVendor ( ) ;
vegVendor. purchase ( ) ;
this . chef = new Chef ( ) ;
this . wait = new Waiter ( ) ;
this . clean = new Cleaner ( ) ;
}
public void order ( ) {
wait. order ( ) ;
chef. cook ( ) ;
wait. serve ( ) ;
clean. clean ( ) ;
clean. wash ( ) ;
}
}
用户要做的只是登门访问,调用其order()方法即可享受现成可口的饭菜了,操作变得简单而优雅。
6.5 整合共享
软件模块应该只专注于各自擅长的领域,合理明确的分工模式才能更好地整合与共享资源 外观门面类对子系统的整合与共享 极大地保证了用户访问的便利性
6.6 门面模式的各角色定义
Facade(外观门面):封装了多个子系统,并将它们整合起来对外提供统一的访问接口 SubSystemA、SubSystemB(子系统A、子系统B…):隐藏于门面中的子系统,数量任意,且对外部不可见,专注于各自擅长的领域。如:蔬菜商类、厨师类、服务员类等 Client(客户端):门面系统的使用方,只访问门面提供的接口。 门面充当了包装类的角色,对子系统进行整合,再对外暴露统一接口,使其结构内繁外简,最终达到资源共享、简化操作的目的 从另一方面讲,门面模式也降低了客户端与子系统之间的依赖度,高内聚才能低耦合。