楼主: 臧圩人

[笔记] 《Head First设计模式》阅读笔记.第九章

[复制链接]
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
11#
 楼主| 发表于 2010-1-27 10:29 | 只看该作者
3.迭代器(Iterator)模式与组合(Compsite)模式小结

*迭代器允许访问聚合的元素,而不需要暴露它内部的结构。

*迭代器将遍历聚合的工作封装进一个对象里。

*当使用迭代器时,我们依赖聚合提供遍历。

*迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。

*我们应该努力让一个类只分配一个责任。

*组合模式提供一个结构,可同时包容个别对象和组合对象。

*组合对象允许客户对个别对象和组合对象一视同仁。

*组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。

*在实现组合模式时,有许多设计上的折中;要根据需要平衡透明性和安全性。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
12#
 楼主| 发表于 2010-1-27 10:29 | 只看该作者
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;
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
13#
 楼主| 发表于 2010-1-27 10:29 | 只看该作者
// List迭代器
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();
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
14#
 楼主| 发表于 2010-1-27 10:30 | 只看该作者
5.组合(Composite)模式实例

基于以上代码实现:
// 菜单接口
public interface IMenu {
        // 取得名称
        public String getName();

        // 显示
        public void display();

        // 添加菜单
        public void addItem(IMenu menu);

        // 取得所有子菜单
        public Iterator getChildren();
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
15#
 楼主| 发表于 2010-1-27 10:30 | 只看该作者
// 菜单
public class Menu implements IMenu {
        private List<IMenu> items = new ArrayList<IMenu>();

        private String name;

        public Menu(String name) {
                this.name = name;
        }

        public void addItem(IMenu menu) {
                items.add(menu);
        }

        public void display() {
                System.out.println(this.name + ":Menu");
                Iterator children = this.getChildren();
                while (children.hasNext()) {
                        IMenu menu = (IMenu) children.next();
                        menu.display();
                }
        }

        public Iterator getChildren() {
                return new ListIterator(items);
        }

        public String getName() {
                return this.name;
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
16#
 楼主| 发表于 2010-1-27 10:30 | 只看该作者
// 菜单项
public class MenuItem implements IMenu {
        private String name;

        public MenuItem(String name) {
                this.name = name;
        }

        public void display() {
                System.out.println(this.name + ":MenuItem");
        }

        public String getName() {
                return this.name;
        }

        public void addItem(IMenu menu) {
                throw new UnsupportedOperationException();
        }

        public Iterator getChildren() {
                return new NullIterator();
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
17#
 楼主| 发表于 2010-1-27 10:30 | 只看该作者
// 菜单条
public class MenuBar {
        private List<IMenu> menus = new ArrayList<IMenu>();

        public void addMenu(IMenu menu) {
                this.menus.add(menu);
        }

        public void display() {
                System.out.println(":MenuBar");
                Iterator items = new ListIterator(menus);
                while (items.hasNext()) {
                        IMenu menu = (IMenu) items.next();
                        menu.display();
                }
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
18#
 楼主| 发表于 2010-1-27 10:30 | 只看该作者
// 空迭代器
public class NullIterator implements Iterator {
        public boolean hasNext() {
                return false;
        }

        public Object next() {
                return null;
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
19#
 楼主| 发表于 2010-1-27 10:31 | 只看该作者
// 测试程序
public class TestMenuBar {
        public static void main(String[] args) {
                IMenu menu1 = new Menu("File");
                IMenu item1 = new MenuItem("  New");
                IMenu item2 = new MenuItem("  Open");
                IMenu item3 = new MenuItem("  Exit");
                menu1.addItem(item1);
                menu1.addItem(item2);
                menu1.addItem(item3);

                IMenu menu2 = new Menu("Edit");
                IMenu item4 = new MenuItem("  Cut");
                IMenu menu3 = new Menu("  Find");
                IMenu item5 = new MenuItem("    Find Next");
                IMenu item6 = new MenuItem("    Find Previous");
                IMenu item7 = new MenuItem("    Replace");
                IMenu item8 = new MenuItem("  Copy");
                menu2.addItem(item4);
                menu2.addItem(menu3);
                menu2.addItem(item8);
                menu3.addItem(item5);
                menu3.addItem(item6);
                menu3.addItem(item7);

                MenuBar bar = new MenuBar();
                bar.addMenu(menu1);
                bar.addMenu(menu2);
                bar.display();
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
20#
 楼主| 发表于 2010-1-27 10:31 | 只看该作者
测试结果:
: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--

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表