【大道模式】外观模式-Facade Pattern

    当你的系统需要分层设计 或者 需要在子系统和客户端之间建立一个高层接口使得子系统更容易复用时,就需要考虑使用外观模式了。

基本介绍:

1.外观模式(Facade),也叫"过程模式":外观模式为子系统中的一组接口提供一个一致(稳定)的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。

2.外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

3.当系统需要进行分层设计时,可以考虑Facade模式。

 

方案A:

【大道模式】外观模式-Facade Pattern_第1张图片

方案B:

【大道模式】外观模式-Facade Pattern_第2张图片

A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。

核心组件:

1)外观类(Facade):为调用者提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象。

2)调用者(Client):外观接口的调用者。

3)子系统的集合:指模块或者子系统,处理Facade对象指派的任务,它是功能的实际提供者。

下面假设一种场景,造一辆车:需要生产零件,组装,喷漆:

传统方式代码

Controller:

public class BuildController {

    private ProduceService produceService;

    private PackageService packageService;

    private PaintService paintService;

    public void buildCar() {
        produceService.work();
        packageService.work();
        paintService.work();
    }
}

Service:

public class PackageService {

    public void work() {
        System.out.println("package work");
    }
}

public class PaintService {

    public void work() {
        System.out.println("Paint work");
    }
}

public class ProduceService {

    public void work() {
        System.out.println("produce work");
    }
}

 

外观模式进行改进

Controller:

public class BuildController {

    private BuildFacadeService buildFacadeService;

    public void buildCar() {
        buildFacadeService.work();
    }
}

FacadeService:

import design.pattern.facade.tranditional.PackageService;
import design.pattern.facade.tranditional.PaintService;
import design.pattern.facade.tranditional.ProduceService;

public class BuildFacadeService {

    private ProduceService produceService;
    private PackageService packageService;
    private PaintService paintService;

    public void work() {
        produceService.work();
        packageService.work();
        paintService.work();
    }
}

说明:

不能过多或盲目不合理的使用外观模式,外观模式还是直接模块调用,要以系统有层次,利于维护为目的。

 

Author:忆之独秀

Email:[email protected]

注明出处:https://lavorange.blog.csdn.net/article/details/107878361

你可能感兴趣的:(DesignPattern,Java)