首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

兑现模式之方法二

2012-08-27 
实现模式之方法二???? 6. 容器访问方法???? 如果对象中包含了一个容器,那么它应该怎样暴露给其他的对象呢?

实现模式之方法二

???? 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;

?????? }

?

????? 其实这是一种补救措施,出现这种情况,标明程序有深层的设计问题。

????

热点排行