您的位置:首页 > 其它

设计模式学习笔记—外观模式

2016-01-21 18:36 267 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LiynGu/article/details/50556769

外观模式(Facade pattern)

首先,为什么我们需要外观模式?
答:接口太多了,需要一个新的接口去统一这些接口。
我有个疑问就是,如果代码接口变多,显得有些乱,去统一一下接口不是很正常的事情吗?如果代码设计时某些类有明显的从属关系,为其设计一个统一管理的接口也是很正常的吧。
抱着这个疑问,我去翻了wiki。
然而,也是简单的去统一接口。
但是,并不能说明外观模式简单,如果项目的代码量多到一定程度,而且是一个比较糟糕的设计,或者是要为另一个项目去提供一套新的接口,这个的话很明显并不简单。
这么想的话,平时用的三层架构应该就是外观模式了,对 UI 层只提供 service 的接口,不关注 service 的实现,同样,service 也不去关注 dao 的实现, 只关注 dao 的接口。
既然是学习笔记还是写点代码吧。
这是两个 dao 的不完整设计

public interface BookDao {
Book getById(int id);
List<Book> getByUserId(int userId);
void save(Book book);
void save(Book book, int userId);
}
public interface UserDao {
User getByLogin(String username, String password);
User getById(int id);
void save(User user);
}

然后是 UserService 及其实现

public interface UserService {
void login(String username, String password);
List<Book> updateUserBooks(User user);
}
public  class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
private BookDao bookDao = new BookDaoImpl();

@Override
void login(String username, String password) {
User user = userDao.getByLogin(username, password);
if (user == null) {
// 用异常的方式处理用户登录失败
throw new RuntimeException("login error");
}
user.addBooks(bookDao.getByUserId(user.getId()));
}

@Override
public List<Book> updateUserBooks(User user) {
// 这种代码写得很糟糕
for(Book book : user.getBooks()) {
// 如果 dao 不提供 saveAll 方法的话,就只能用这个了
bookDao.save(book, user.getId());
}
// 最后把更新后的结果返回,不管前端用不用的到
return bookDao.getByUserId(user.getId);
}
}

这样的话就用 service 做了 dao 的外观,如果代码更加复杂就再加一层 service 作为外观这个样子,当调用的时候就是这样了。

UserService userService = new UserServiceImpl();
try {
User user = userService.login("test", "123");
user.addBook(new Book("new book"));
userService.updateUserBooks(user);
} catch (RuntimeException e) {
// TODO: handle exception
}

感觉的话还是那样,外观模式的代码写起来会很简单,思想和类图也很简单,但真正设计项目或者项目重构的时候,就会有难度了,这个设计模式,应该是那种只能多写项目才能学会的设计模式(个人感觉)。

The end.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: