爲複雜系統提供一個「綜合性對外窗口」的方案——外觀模式總結

前言

外觀模式也叫門面模式,英文是 facade。這是很常見的一種設計模式,它好比 JDK 中的 Socket 接口就應用了外觀模式,參考:門面模式的典型應用 Socket 和 Http(post,get)、TCP/IP 協議的關係總結html

外觀模式也很是簡單,它提供了一個統一的對外的高層次接口,用來訪問子系統中的一羣接口,也是對象的結構型模式,它符合迪米特法則——最少知道原則,類比現實,好比政府的綜合性辦事大廳,就很是像 facade 模式。設計模式

閒言少敘,直接看代碼,外觀模式的代碼很是好寫,可是也很差寫,簡單是由於其沒有特殊的組合、繼承、或者抽象的地方,按照我我的理解,就是一種集中接口的思惟的體現,難在須要結合業務的實際狀況。post

外觀模式的實現

一個網上商城的最簡單例子,在網上商城用錢買商品,也可使用積分兌換商品,有驗證系統(好比資格驗證,身份驗證等),支付系統,物流系統等模塊,若是客戶端(業務方)每次使用,都要考慮這三個接口,不只各個子系統的 RD 維護複雜,也給業務方增長了使用負擔,那麼就適合使用 facade 模式,進行高層次的一個抽象。this

代碼以下:Goods 表明商品類,Validate 服務,Distribute 配送服務,還有一個 payoff 支付服務,三個子系統由 facade 服務統一規劃。url

public class Goods { 
    private String name;

    public Goods(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
////////////////////////////////////
public class ValidateService {
    public boolean isOk(Goods goods) {
        System.out.println("驗證:" + goods.getName() + "是否有資格兌換商品");
        return true;
    }
}
////////////////////////////////////
public class PayoffService {
    public boolean payoff(Goods goods) {
        System.out.println("兌換:" + goods.getName() + " 成功");
        return true;
    }
}
///////////////////////////////////
public class DistributionService {
    public void distribution(Goods goods) {
        System.out.println("生成訂單,準備配送: " + goods.getName());
    }
}
//////////////////////////////////
public class FacadeService {
    private ValidateService validateService;
    private PayoffService payoffService;
    private DistributionService distributionServicel;

    public void setValidateService(ValidateService validateService) {
        this.validateService = validateService;
    }

    public void setPayoffService(PayoffService payoffService) {
        this.payoffService = payoffService;
    }

    public void setDistributionServicel(DistributionService distributionServicel) {
        this.distributionServicel = distributionServicel;
    }

    public void pay(Goods goods) {
        if (this.validateService.isOk(goods)) {
            if (this.payoffService.payoff(goods)) {
                this.distributionServicel.distribution(goods);
            }
        }
    }
}

簡化了客戶端調用spa

public class Main {
    public static void main(String[] args) {
        FacadeService facadeService = new FacadeService();
        Goods goods = new Goods("哈哈皮鞋");
        facadeService.setDistributionServicel(new DistributionService());
        facadeService.setPayoffService(new PayoffService());
        facadeService.setValidateService(new ValidateService());
        facadeService.pay(goods);
    }
}

效果以下:設計

外觀模式也能夠和單例模式搭配

好比上述案例,徹底能夠把子系統單例化使用,固然實際業務中,可能 Spring 全家桶更多一些,service 類直接全局配成單例的對象。code

外觀模式的優勢

facade 可讓很是複雜的系統,變的簡單好用,好比只提供一個對外的統一門面,屏蔽內部系統的複雜API,本質就是讓系統的對外接口變少htm

外觀模式和中介者模式的區別

中介者模式是雙向的進行管理和約束,外觀模式是單向的管理和約束。具體參考:對象關係一對多轉換爲一對一的方案——中介者模式總結對象

相關文章
相關標籤/搜索