在开发基于Web的Java应用程序时,我对Facade模式的使用有点困惑,或者更准确地说,我可以说我无法想象它的确切用法。 这是我的用例:
我有一个Web应用程序,其中我还有Action类,服务层和DAO层。我的Action类负责与UI(JSP)交互,而服务层将负责处理任何业务逻辑以及与DAO层交互并完成与DB相关的工作。
我可以创建服务层接口,并可以在我的动作类中公开它们,以便我的动作类可以与服务层交互并完成任何工作。
我被要求引入另一个图层作为Facade,我需要将方法公开给我的Action类,而服务图层现在在Facade中公开。
任何人都可以帮我澄清一下被问到的是正确的以及这种方法会带来什么好处,因为在我看来,引入额外的层并没有在外立面层进行太多的工作(繁重的工作仍然在服务中)层。)
答案 0 :(得分:2)
通过在服务和操作之间使用外观,您不必总是在操作中使用特定服务,只需使用外观即可。此外,某些操作将以相同的方式使用服务组合,如果您可以将它放在外观中的方法中,您将节省一些时间,因为您可以重复使用使用该服务组合的Facade方法。 p>
答案 1 :(得分:2)
除了@Tom写的内容外,交易是另一回事。如果要在同一事务中使用多个服务,例如从一个服务读取,使用第二个服务写入数据库,如果在Facade级别定义事务边界,则可以使用相同的事务执行此操作。
你是对的,在最简单的情况下,你的Facade将直接委托给一个服务,但在更复杂的情况下,它可能会在顶部有一个额外的层。特别是如果您的服务非常精细,那么在它们周围缠绕更粗糙的层是有意义的。无论您将该层称为 Facade 还是仅调用其他服务层,都是一件小事。
答案 2 :(得分:0)
这是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();
}
}
答案 3 :(得分:0)
任何人都可以帮我澄清一下被问到的是正确的,这种方法会带来什么好处?
Facade 为子系统中的一组接口提供统一接口。 Facade Pattern定义了一个更高级别的接口,使子系统更易于使用。
Facade 模式更像是客户端应用程序的 帮助
何时使用:
请参阅下面的帖子,通过工作代码示例更好地理解模式( TravelFacade有助于FlightBooking,TrainBooking和HotelBooking ):