Java 立面图案的使用

Java 立面图案的使用,java,design-patterns,jakarta-ee,Java,Design Patterns,Jakarta Ee,在开发基于web的java应用程序时,我对Facade模式的使用感到有点困惑,或者更准确地说,我不能想象它的确切用法。 以下是我的用例: 我有一个web应用程序,其中包括操作类、服务层和DAO层。我的操作类负责与UI(JSP)交互,而服务层负责处理任何业务逻辑,以及与DAO层交互,并完成与DB相关的工作 我可以创建服务层接口,并在动作类中公开它们,以便动作类可以与服务层交互并执行任何工作 我被要求引入另一个层作为Facade,在这里我需要将方法公开给我的Action类,而服务层现在在Facade

在开发基于web的java应用程序时,我对Facade模式的使用感到有点困惑,或者更准确地说,我不能想象它的确切用法。 以下是我的用例:

我有一个web应用程序,其中包括操作类、服务层和DAO层。我的操作类负责与UI(JSP)交互,而服务层负责处理任何业务逻辑,以及与DAO层交互,并完成与DB相关的工作

我可以创建服务层接口,并在动作类中公开它们,以便动作类可以与服务层交互并执行任何工作

我被要求引入另一个层作为Facade,在这里我需要将方法公开给我的Action类,而服务层现在在Facade中公开


有谁能帮我澄清一下所问的是什么是正确的,以及这种方法会带来什么好处,因为在我看来,这就像是在门面层中引入额外的层,而在门面层中没有做太多工作(繁重的工作仍在服务层中。)

通过在服务和行动之间使用门面,您不必总是在操作中使用特定的服务,您只需使用facade。此外,有些操作将以相同的方式使用服务组合,如果您可以将其放入facade中的方法中,您将节省一些时间,因为您可以重用使用该服务组合的facade方法。

通过在服务和操作之间使用facade,您不必总是在操作中使用特定的服务,您只需使用facade。此外,有些操作将以相同的方式使用服务组合,如果您可以将其放入facade中的方法中,您将节省一些时间,因为您可以重用使用该服务组合的facade方法。

除了@Tom编写的内容之外,事务是另一件需要考虑的事情。如果您希望在同一事务中使用多个服务,例如,从一个服务读取,使用第二个服务写入数据库,那么如果您在门面级别上定义了事务边界,则可以使用同一事务来执行此操作


您是对的,在最简单的情况下,您的Facade将直接委托给一个服务,但在更复杂的情况下,在顶部添加一个额外的层可能会有回报。特别是如果您的服务是非常细粒度的,那么在它们周围有一个更粗粒度的层是有意义的。无论您将该层称为Facade还是仅仅称为另一个服务层,这都是一件小事。

除了@Tom所写的之外,事务是另一件需要考虑的事情。如果您希望在同一事务中使用多个服务,例如,从一个服务读取,使用第二个服务写入数据库,那么如果您在门面级别上定义了事务边界,则可以使用同一事务来执行此操作


您是对的,在最简单的情况下,您的Facade将直接委托给一个服务,但在更复杂的情况下,在顶部添加一个额外的层可能会有回报。特别是如果您的服务是非常细粒度的,那么在它们周围有一个更粗粒度的层是有意义的。无论您将该层称为Facade还是仅仅称为另一个服务层,这都是一件小事。

这里是Facade模式的一个很好的例子

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

下面是正面模式的一个很好的例子

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}
有谁能帮助我澄清所问的是什么是正确的,以及这种方法会带来什么好处

为子系统中的一组接口提供统一接口。Facade模式定义了更高级别的接口,使子系统更易于使用

Facade模式更像客户端应用程序的助手

何时使用:

  • 访问复杂系统需要一个简单的接口
  • 子系统的抽象和实现是紧密耦合的
  • 需要一个分层软件的每个级别的入口点
  • 系统非常复杂或难以理解
  • 请参阅下面的文章,通过工作代码示例更好地理解模式(TravelFacade,它有助于机票预订、火车预订和酒店预订):

    有谁能帮助我澄清所问的是什么是正确的,以及这种方法会带来什么好处

    为子系统中的一组接口提供统一接口。Facade模式定义了更高级别的接口,使子系统更易于使用

    Facade模式更像客户端应用程序的助手

    何时使用:

  • 访问复杂系统需要一个简单的接口
  • 子系统的抽象和实现是紧密耦合的
  • 需要一个分层软件的每个级别的入口点
  • 系统非常复杂或难以理解
  • 请参阅下面的文章,通过工作代码示例更好地理解模式(TravelFacade,它有助于机票预订、火车预订和酒店预订):

    可以参考可以参考