天天看點

設計模式原來這麼簡單-門面模式(Facade)

1.什麼是門面模式

為一個子系統中的一系列接口提供一個統一的接口。外觀定義了一個更進階别的接口以便子系統更容易使用。

2.執行個體

例如一個項目需要的人員有産品經理、研發經理、前端、後端、測試等共同協作來完成,而從甲方的角度看來隻需要拿錢啟動項目最後驗收項目即可

3.程式示例

public interface IProjectWorker {

    void startDailyWork();

    void pauseToRest();

    void endDailyWork();

    String getName();
}
           
public abstract class BaseProjectWorker implements IProjectWorker{
    private String name;
    protected BaseProjectWorker(String name){
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}
           
public class FrontProgrammer extends BaseProjectWorker{

    protected FrontProgrammer(String name) {
        super(name);
    }

    @Override
    public void startDailyWork() {
        System.out.println("[FrontProgrammer] 開始編寫前端頁面");
    }

    @Override
    public void pauseToRest() {
        System.out.println("[FrontProgrammer] 休息去喝咖啡");
    }

    @Override
    public void endDailyWork() {
        System.out.println("[FrontProgrammer] 結束編寫前端頁面");
    }
}
           
public class BackProgrammer extends BaseProjectWorker{

    protected BackProgrammer(String name) {
        super(name);
    }

    @Override
    public void startDailyWork() {
        System.out.println("[FrontProgrammer] 開始編寫後端頁面");
    }

    @Override
    public void pauseToRest() {
        System.out.println("[FrontProgrammer] 休息去喝茶");
    }

    @Override
    public void endDailyWork() {
        System.out.println("[FrontProgrammer] 結束編寫後端頁面");
    }

}
           
public class TestProgrammer extends BaseProjectWorker{

    protected TestProgrammer(String name) {
        super(name);
    }

    @Override
    public void startDailyWork() {
        System.out.println("[TestProgrammer] 開始測試");
    }

    @Override
    public void pauseToRest() {
        System.out.println("[TestProgrammer] 休息去喝咖啡");
    }

    @Override
    public void endDailyWork() {
        System.out.println("[TestProgrammer] 結束測試");
    }
}
           
public class ProjectFacade {
    private List<IProjectWorker> workers;
    public ProjectFacade(){
        workers = new ArrayList<>();
        workers.add(new FrontProgrammer("一号前端"));
        workers.add(new FrontProgrammer("二号前端"));
        workers.add(new BackProgrammer("一号後端"));
        workers.add(new BackProgrammer("二号後端"));
        workers.add(new BackProgrammer("三号後端"));
        workers.add(new TestProgrammer("一号測試"));
    }

    public void startProject(){
    	System.out.println("[Boss] 不完成項目不準休息^o`");
        workers.forEach(IProjectWorker::startDailyWork);
    }

    public void endProject(){
        workers.forEach(IProjectWorker::endDailyWork);
    }
}
           

4.測試

@Test
public void test(){
    // 同樣也是提供給使用者的接口
    ProjectFacade projectFacade = new ProjectFacade();

    projectFacade.startProject();

    projectFacade.endProject();
}
           

5.測試輸出

[Boss] 不完成項目不準休息^o`

[FrontProgrammer] 開始編寫前端頁面

[FrontProgrammer] 開始編寫前端頁面

[FrontProgrammer] 開始編寫後端頁面

[FrontProgrammer] 開始編寫後端頁面

[FrontProgrammer] 開始編寫後端頁面

[TestProgrammer] 開始測試

[FrontProgrammer] 結束編寫前端頁面

[FrontProgrammer] 結束編寫前端頁面

[FrontProgrammer] 結束編寫後端頁面

[FrontProgrammer] 結束編寫後端頁面

[FrontProgrammer] 結束編寫後端頁面

[TestProgrammer] 結束測試

6.總結

接口的多個子類完成一項工作的時候适合使用門面模式的思想去封裝下,提高了系統的易用性和使用者的産品體驗