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