1.迭代器(Iterator)模式部分
----Sharpen Your Pencil解答----
A、C、D、E
------------
*當我們說“集合(Collection)”的時候,我們指的是一群對象。其存儲方式可以是各式各樣的數(shù)據(jù)結構,例如:列表、數(shù)組、散列表,無論用什么方式存儲,一律可以視為集合。有時候也被稱為聚合(aggregate)。
- ----習題解答----
- public class PancakeHouseIterator implements Iterator {
- private List items;
-
- private int position = 0;
-
- public PancakeHouseIterator(List items) {
- this.items = items;
- }
-
- public Object next() {
- position += 1;
- return items.get(position);
- }
-
- public boolean hasNext() {
- if(position >= items.size()){
- return false;
- } else {
- return true;
- }
- }
- }
-
- public class PancakeHouseMenu {
- ArrayList menuItems;
-
-
-
-
-
-
-
-
-
-
-
- public Iterator createIterator() {
- return new PancakeHouseIterator(menuItems);
- }
-
-
- }
- ------------
*在實現(xiàn)java.util.Iterator接口時,如果不需要remove()方法,可以跑出java.lang.UnsupportedOperationException異常。
迭代器模式:提供一種順序訪問集合對象中各個元素的方法,而又不暴露其內部的表示(也就是數(shù)據(jù)結構)。
*迭代器(Iterator)模式把元素之間游走的任務交給了迭代器,而不是聚合對象。這不僅讓聚合的接口和實現(xiàn)變得更簡潔,也讓它專注于管理對象,而不必理會遍歷的事情。
----Brain Power解答----
工廠方法(Factory Method)模式
------------
*類的每個責任都有一個潛在的改變區(qū)域,多一個責任就意味著多一個改變的區(qū)域。要盡量讓每個類保持單一責任。
軟件設計原則:一個類應該只有一個引起變化的原因。
*既要讓每個類都保持單一的責任,也要保證一個責任只指派給一個類。
*內聚(Cohesion)用來度量一個類或模塊緊密地達到單一目的或責任的程度。
*當一個類或模塊被設計成只支持一組相關功能時,我們說它具有高內聚;反之,當被設計成支持一組不相關的功能時,我們說它具有低內聚。
----Brain Power解答----
具有多重責任的類:Game、Person、DeckOfCards、ShoppingCart、Iterator
------------
----Brain Power 2解答----
低內聚類:Game
高內聚類:GameSession、PlayerActions、Player
------------
----Sharpen Your Pencil解答---
1、定義一個迭代器類,實現(xiàn)咖啡廳菜單的遍歷
2、刪除CafeMenu類的getItems()方法
3、讓CafeMenu類繼承Menu接口并實現(xiàn)createIterator()方法
------------
*框架(framework)指一群類和接口。
*在Java 5中新增了一種“for/in”語句支持對集合類的遍歷。形式如下:
for(Object obj:collection) {
obj.methodName();
...
}
- ----代碼貼解答----
- import java.util.Iterator;
- import java.util.Calendar;
-
- public class AlternatingDinerMenuIterator implements Iterator {
- MenuItem[] items;
- int position;
-
- public AlternatingDinerMenuIterator(MenuItem[] items) {
- this.items = items;
- Calendar rightNow = Calendar.getInstance();
- position = rightNow.get(Calendar.DAY_OF_WEEK) % 2;
- }
-
- public boolean hasNext() {
- if (position >= items.length || items[position] == null) {
- return false;
- } else {
- return true;
- }
- }
-
- public Object next() {
- MenuItem menuItem = items[position];
- position = position + 2;
- return menuItem;
- }
-
- public void remove() {
- throw new UnsupportedOperationException("Alternating Diner Menu Iterator does not support remove()");
- }
- }
- ------------
-
- ----Brain Power解答----
- 修改女招待類如下:
- public class Waitress {
- MenuItem[] menus;
-
- public Waitress(MenuItem[] menus) {
- this.menus = menus;
- }
-
- public void printMenu() {
- for(MenuItem menu: menus) {
- printMenu(menu.createIterator());
- }
- }
-
- private void printMenu(Iterator items) {
- while(items.hasNext()) {
- MenuItem item = (MenuItem)items.next();
- ...
- }
- }
- }
- ------------
2.組合(Composite)模式部分
組合模式:將對象組合成樹狀結構來表現(xiàn)“整體/部分”的層級結構,讓客戶以一致的方式來處理個別對象以及對象組合。
*在樹狀結構中,帶有子元素的元素成為節(jié)點(Node);沒有子元素的元素成為葉節(jié)點(Leaf)。
*組合(Composite)模式犧牲了單一責任設計原則,換取了透明性(Transprency)。
----Brain Power解答----
從上到下,從左到右一次遍歷樹結構的所有節(jié)點。
------------
*空迭代器(Iterator)是空對象(null object)“設計模式”的又一個例子,之前的例子是“空命令(NullCommand)”。
- ----空迭代器實例----
- public class NullIterator implements Iterator {
- public boolean hasNext() {
- return false;
- }
-
- public Object next() {
- return null;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
- }
- ------------
*“空對象設計模式”帶來的好處是客戶不用處理null,因此不必擔心系統(tǒng)會跑出NullPointerException。
*當多個對象彼此之間有“整體/部分”的關系,并且你想用一致的方式處理這些對象時(就是讓它們看起來一樣,有共同的方法可以調用),就需要用組合(Composite)模式。
*包含其它組件的組件被稱為組合對象,沒有包含其它組件的組件被稱為葉節(jié)點對象。
*組合通常是樹形結構,也就是一種層次結構,根就是頂層的組合,往下是它的孩子,最末端是葉節(jié)點。
*為了更方便操作,比如把一個子節(jié)點從它的父節(jié)點刪除,可以讓子節(jié)點保存到父節(jié)點的一個引用。
*在組合中加入緩存可以提高遍歷的性能。
----連連看解答----
策略->封裝可互換的行為,并用委托決定使用哪一個
適配器->改變一個或多個類的接口
迭代器->提供一個方式來遍歷組合,而無需暴露組合的實現(xiàn)
外觀->簡化一群類的接口
組合->客戶可以將對象的組合以及個別對象一視同仁
觀察者->當某個狀態(tài)改變時,允許一群對象能被通知到
------------
3.迭代器(Iterator)模式與組合(Compsite)模式小結
*迭代器允許訪問聚合的元素,而不需要暴露它內部的結構。
*迭代器將遍歷聚合的工作封裝進一個對象里。
*當使用迭代器時,我們依賴聚合提供遍歷。
*迭代器提供了一個通用的接口,讓我們遍歷聚合的項,當我們編碼使用聚合的項時,就可以使用多態(tài)機制。
*我們應該努力讓一個類只分配一個責任。
*組合模式提供一個結構,可同時包容個別對象和組合對象。
*組合對象允許客戶對個別對象和組合對象一視同仁。
*組合結構內的任意對象稱為組件,組件可以是組合,也可以是葉節(jié)點。
*在實現(xiàn)組合模式時,有許多設計上的折中;要根據(jù)需要平衡透明性和安全性。
4.迭代器(Iterator)模式實例
-
- public interface Iterator {
- public boolean hasNext();
-
- public Object next();
- }
-
-
- public class ArrayIterator implements Iterator {
- private Object[] objects;
-
- private int position = 0;
-
- public ArrayIterator(Object[] objects) {
- this.objects = objects;
- }
-
- public boolean hasNext() {
- return position < objects.length - 1;
- }
-
- public Object next() {
- Object retObj = objects[position];
- position += 1;
- return retObj;
- }
- }
-
-
- public class ListIterator implements Iterator {
- private java.util.Iterator iter;
-
- public ListIterator(List list) {
- this.iter = list.iterator();
- }
-
- public boolean hasNext() {
- return iter.hasNext();
- }
-
- public Object next() {
- return iter.next();
- }
- }
5.組合(Composite)模式實例
基于以上代碼實現(xiàn):
測試結果:
引用
:MenuBar
File:Menu
New:MenuItem
Open:MenuItem
Exit:MenuItem
Edit:Menu
Cut:MenuItem
Find:Menu
Find Next:MenuItem
Find Previous:MenuItem
Replace:MenuItem
Copy:MenuItem
--END--