假设场景:
A酒店: 要添加掌上app点菜功能.他提供的菜单是list.
B酒店:也要添加掌上app点菜功能,他提供的菜单是数组.
现在A,B同时都要求让Center来帮他们开app点菜.
对于Center来说 A和B只是提供的数据接口不同,没有必要为他们单独都开发一套app.那么怎么实现不同数据接口处理呢?答案就是Ite模式
A酒店菜:
public class MenuA {
private List<String> items = null;
public MenuA() {
items = new ArrayList<String>();
items.add("aaaa==>1");
items.add("aaaa==>2");
items.add("aaaa==>3");
}
public List<String> getItems() {
return items;
}
}
B酒店:
public class MenuB {
private String[] items = null;
public MenuB() {
items = new String[3];
items[0] = "bbbb==>1";
items[1] = "bbbb==>2";
items[2] = "bbbb==>3";
}
public String[] getItems() {
return items;
}
}
Center 菜单接口:
public interface CenterMenu {
public Iterator<String> getMenu();
}
Center对A酒店的适配:
public class CenterMenuA implements CenterMenu {
private Iterator<String> ite;
public CenterMenuA(List<String> menus) {
this.ite = menus.iterator();
}
public Iterator<String> getMenu() {
return ite;
}
}
Center对B酒店的适配:
public class CenterMenuB implements Iterator<String>, CenterMenu {
String[] items;
int position = 0;
public CenterMenuB(String[] is) {
this.items = is;
}
public boolean hasNext() {
try {
if (items[position] != null) {
return true;
}
return false;
} catch (Exception e) {
return false;
}
}
public String next() {
return items[position++];
}
public void remove() {
}
public Iterator<String> getMenu() {
return this;
}
}
测试结果:
public class AppTest extends TestCase {
public void testApp() {
CenterMenu menuA = new CenterMenuA((new MenuA()).getItems());
CenterMenu menuB = new CenterMenuB((new MenuB()).getItems());
print("menuA", menuA);
print("menuB", menuB);
}
private void print(String title, CenterMenu menu) {
System.out.println(title);
while (menu.getMenu().hasNext()) {
String next = menu.getMenu().next();
System.out.println(next);
}
}
}
结果显示
menuA
aaaa==>1
aaaa==>2
aaaa==>3
menuB
bbbb==>1
bbbb==>2
bbbb==>3
这例子中,还体现了适配器模式.可以这样理解: A是双口插头,B是三口插头 经过适配成四口插头(^_^ 现实应该没有,只为举例子*_*)插入center的插座中
例子源码svn:http://design-iterate.googlecode.com/svn/trunk/