实现模式之方法二
???? 6. 容器访问方法
???? 如果对象中包含了一个容器,那么它应该怎样暴露给其他的对象呢?最简单的方法是提供一个get方法,比如:
???? List<books> getBooks() {
?????????? return books;
?????? }
?
?????这样暴露的接口给了客户最大的灵活性,客户获得这个容器之后,可以进行任何操作。现在假设这么一种场景:
?????该对象里面某一些内部状态依赖于这个容器,如果修改这个容器里面的内容会影响到这些内部状态。那么直接返回这个容器,将会导致这些内部状态变得不可控了。
???? 这个时候,应该为这个容器提供一些限制性的,意义明确的访问途径。比如:
???? void addBook(Book arrival) {
??????? books.add(arrival);
????? }
????
????? int bookCount() {
???????? return books.size();
?????? }
?
?????? Iterator getBooksIterator() {
????????? return books.iterator();
??????? }
?
???? 这样就能够防止用户修改容器,导致内部状态的不可控。
?
???? 7. 安全副本
???? 假设有两个对象都以为知己可以独占地访问某一容器A,也就是这两个对象希望对容器A的操作不相互影响。那么在用get方法获取容器A的时候,就必须对其进行复制。比如:
???? List<Book> getBooks() {
???????? List<Book> result = new ArrayList<Book>();
???????? result.addAll(books);
???????? return result;
?????? }
?
????? 其实这是一种补救措施,出现这种情况,标明程序有深层的设计问题。
????