1. 设计模式-外观模式
外观模式(Facade Pattern)是一种结构型设计模式,它为一组复杂的子系统提供一个一致的高层接口,使子系统更容易被外界访问和使用。外观模式隐藏了系统的内部复杂性,并为客户端提供了一个更简单的接口,减少了客户端与子系统之间的耦合度。
2. 子系统类
假设我们有一个系统包含三个子系统模块:Database、Security和Logging。
public class Database {
public void connect() {
System.out.println("Connecting to the database...");
}
public void disconnect() {
System.out.println("Disconnecting from the database...");
}
}
public class Security {
public boolean login(String user, String password) {
System.out.println("Logging in user: " + user);
// Simplified logic for demonstration purposes
return true;
}
public void logout() {
System.out.println("Logging out user...");
}
}
public class Logging {
public void logInfo(String message) {
System.out.println("[INFO] " + message);
}
public void logError(String message) {
System.out.println("[ERROR] " + message);
}
}
3. 外观类(Facade)
外观类提供了一个简单的接口,隐藏了子系统的复杂性。
public class SystemFacade {
private Database database;
private Security security;
private Logging logging;
public SystemFacade() {
this.database = new Database();
this.security = new Security();
this.logging = new Logging();
}
public void performTask(String user, String password) {
logging.logInfo("Starting task...");
if (security.login(user, password)) {
try {
database.connect();
// Perform the actual task here...
System.out.println("Task executed successfully.");
} finally {
database.disconnect();
security.logout();
}
} else {
logging.logError("Login failed.");
}
logging.logInfo("Task finished.");
}
}
4. 使用示例
public class Main {
public static void main(String[] args) {
SystemFacade facade = new SystemFacade();
facade.performTask("admin", "password123");
}
}
外观模式是解决系统复杂性的一种有效手段,通过提供一个统一的高层接口,它简化了客户端与子系统的交互,提高了系统的可用性和可维护性。然而,设计时应警惕不要过度简化,以免牺牲系统的灵活性和功能的可发现性。合理运用外观模式,可以有效地隔离变化,促进系统的模块化设计。
5. 优点
- 简化接口:为复杂的子系统提供了一个简洁的接口,降低了客户端与子系统的耦合度。
- 提高易用性:使得子系统更容易使用,客户端无需了解子系统的内部细节。
- 减少系统间的依赖:通过外观类,客户端只需要与外观交互,减少了对子系统的直接依赖。
6. 缺点
- 可能隐藏子系统的能力:过于简单的外观可能隐藏了子系统的某些功能,限制了系统的灵活性。
- 过度集中:如果外观类承担太多职责,可能会变得庞大且复杂,反而增加了维护难度