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

外观模式(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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值