您好,登錄后才能下訂單哦!
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
在移動(dòng)互聯(lián)網(wǎng)沒(méi)有普及之前,去飯店吃飯的流程大致如下:選座位,排隊(duì),點(diǎn)菜,結(jié)賬。后來(lái)移動(dòng)互聯(lián)網(wǎng)普及,通過(guò)手機(jī)APP就可以操作這些流程,非常的方便快捷:通過(guò)手機(jī)可以知道某飯店是不是還有空位,到了飯店之后直接入座,然后通過(guò)手機(jī)點(diǎn)菜,結(jié)賬,中間省去了很多繁瑣的流程。
/**
* 外觀模式描述飯店就餐流程
*/
public class C01_InScene {
public static void main(String[] args) {
EatAppFacade eatAppFacade = new EatAppFacade () ;
eatAppFacade.dining();
}
}
// 預(yù)定
class Booking {
private static Booking booking = new Booking() ;
public static Booking getInstance (){
return booking ;
}
public void bookPlace (){
System.out.println("位置預(yù)定...");
}
}
// 點(diǎn)餐
class TakeOrder {
private static TakeOrder takeOrder = new TakeOrder ();
public static TakeOrder getInstance (){
return takeOrder ;
}
public void orderDishes (){
System.out.println("點(diǎn)餐...");
}
}
// 付款
class Payment {
private static Payment payment = new Payment () ;
public static Payment getInstance (){
return payment ;
}
public void payMoney (){
System.out.println("結(jié)賬...");
}
}
// 點(diǎn)餐APP
class EatAppFacade {
private Booking booking ;
private TakeOrder takeOrder ;
private Payment payment ;
public EatAppFacade (){
this.booking = Booking.getInstance() ;
this.takeOrder = TakeOrder.getInstance() ;
this.payment = Payment.getInstance() ;
}
// 就餐流程
public void dining (){
booking.bookPlace();
takeOrder.orderDishes();
payment.payMoney();
}
}
外觀模式是對(duì)象的結(jié)構(gòu)模式,客戶(hù)端與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行。外觀模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。
客戶(hù)端可以調(diào)用這個(gè)角色的方法。此角色具有相關(guān)的子模塊的功能。在正常情況下,本角色會(huì)將所有從客戶(hù)端發(fā)來(lái)的請(qǐng)求委派到相應(yīng)的子系統(tǒng)去。
可以同時(shí)有一個(gè)或者多個(gè)子模塊。每個(gè)子模塊都不是一個(gè)單獨(dú)的類(lèi),而是一個(gè)類(lèi)的集合(如上面的子模塊就是由ModuleA、ModuleB、ModuleC三個(gè)類(lèi)組合而成)。每個(gè)子系統(tǒng)都可以被客戶(hù)端直接調(diào)用,或者被外觀角色調(diào)用。子模塊并不知道外觀的存在,對(duì)于子模塊而言,外觀角色僅僅是另外一個(gè)客戶(hù)端。
外觀對(duì)象功能的調(diào)用者。
public class C02_Facade {
public static void main(String[] args) {
Facade facade = new Facade();
facade.clientNeed1();
facade.clientNeed2();
}
}
class ModuleA {
public void testA (){
System.out.println("ModuleA.testA()");
}
}
class ModuleB {
public void testB (){
System.out.println("ModuleB.testB()");
}
}
class ModuleC {
public void testC (){
System.out.println("ModuleC.testC()");
}
}
class Facade {
/**
* 客戶(hù)需求1
*/
public void clientNeed1 (){
ModuleA moduleA = new ModuleA();
moduleA.testA();
ModuleB moduleB = new ModuleB();
moduleB.testB();
}
/**
* 客戶(hù)需求1
*/
public void clientNeed2 (){
ModuleB moduleB = new ModuleB();
moduleB.testB();
ModuleC moduleC = new ModuleC();
moduleC.testC();
}
}
Configuration 創(chuàng)建 MetaObject 的時(shí)候。
public class Configuration {
protected ObjectFactory objectFactory;
protected ObjectWrapperFactory objectWrapperFactory;
public Configuration() {
this.objectFactory = new DefaultObjectFactory();
this.objectWrapperFactory = new DefaultObjectWrapperFactory();
}
public MetaObject newMetaObject(Object object) {
return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory);
}
// ... 省去其他源碼
}
public static MetaObject forObject(Object object,
ObjectFactory objectFactory,
ObjectWrapperFactory objectWrapperFactory) {
return object == null ?
SystemMetaObject.NULL_META_OBJECT :
new MetaObject(object, objectFactory, objectWrapperFactory);
}
松散了客戶(hù)端與子模塊的耦合關(guān)系,使子模塊功能的調(diào)用更加簡(jiǎn)單。通過(guò)合理使用Facade,可以更好地劃分訪問(wèn)的層次。有些方法是對(duì)系統(tǒng)外的,有些方法是系統(tǒng)內(nèi)部使用的,把需要暴露給外部的功能集中到門(mén)面中。如果過(guò)多的使用外觀模式,會(huì)讓子模塊功能的維護(hù)變的復(fù)雜,一個(gè)功能方法改變,會(huì)牽扯到多個(gè)外觀對(duì)象的改變。
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。