概念
为复杂的子系统提供一个统一的对外接口,通过这个接口,能更方便、更高效地访问这些子系统,而不需要关心它们内部的复杂逻辑。
应用效果

基本结构

1)外观类(Facade):对外提供统一接口,封装子系统的调用
2)子系统类(Subsystem):负责自身的业务逻辑处理,通常不会对外暴露
3)客户端(Client):通过外观类来使用子系统的功能
代码实现
以 “数据库操作封装” 为例
定义子系统
1)定义实体类
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
2)定义 DAO 接口
public interface UserDAO {
void insert(User user);
User findById(int id);
void update(User user);
void delete(int id);
}
3)实现 DAO 接口
public class UserDAOImpl implements UserDAO {
private Map<Integer, User> database = new HashMap<>();
public void insert(User user) {
database.put(user.getId(), user);
System.out.println("插入用户:" + user.getName());
}
public User findById(int id) {
System.out.println("根据 ID 查询用户:" + id);
return database.get(id);
}
public void update(User user) {
database.put(user.getId(), user);
System.out.println("更新用户:" + user.getName());
}
public void delete(int id) {
User removed = database.remove(id);
System.out.println("删除用户:" + (removed != null ? removed.getName() : "未知"));
}
}
定义外观类
将复杂的数据库调用包装成对业务开发更友好的接口,降低调用门槛
public class UserServiceFacade {
private UserDAO userDAO;
public UserServiceFacade() {
this.userDAO = new UserDAOImpl(); // 实际开发中可注入
}
public void createUser(int id, String name) {
User user = new User(id, name);
userDAO.insert(user);
}
public void viewUser(int id) {
User user = userDAO.findById(id);
if (user != null) {
System.out.println("用户信息:ID=" + user.getId() + ",姓名=" + user.getName());
} else {
System.out.println("未找到对应的用户");
}
}
public void renameUser(int id, String newName) {
User user = userDAO.findById(id);
if (user != null) {
User updatedUser = new User(id, newName);
userDAO.update(updatedUser);
} else {
System.out.println("无法重命名,用户不存在");
}
}
public void removeUser(int id) {
userDAO.delete(id);
}
}
客户端调用
public class Client {
public static void main(String[] args) {
UserServiceFacade userService = new UserServiceFacade();
userService.createUser(1, "鱼皮");
userService.viewUser(1);
userService.renameUser(1, "Yes");
userService.viewUser(1);
userService.removeUser(1);
userService.viewUser(1);
}
}
优缺点
优点
1)简化调用逻辑
2)降低耦合度
3)有利于分层架构设计
缺点
1)功能扩展时不够灵活:用到子系统里一些比较细的功能,就需要回头改外观类,或者绕过它
