模板方法方式呈现了面向对象的无数要害思想,又不须求精通聚合对象的内部结构

  • 《设计情势—可复用面向对象软件的根底》笔者: [美] 埃里克h Gamma /
    Richard Helm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星
    / 蔡敏 / 刘建中 等 机械工业出版社
  • 《重构—改革既有代码的规划》作者: 马丁 Fowler译者:候捷
    中夏族民共和国电力出版社
  • 《敏捷软件开发—原则、方式与履行》我: 罗Bert C. 马丁哈工大东军大学出版社
  • 《程序员修炼之道—从小工到我们》小编: Andrew Hunt / 戴维 托马斯电子工业出版社
  • 《Head First 设计情势》小编: Freeman 译者: O’Reilly Taiwan公司中中原人民共和国电力出版社
  • 《设计形式之禅》 我: 秦小波 机械工业出版社
  • MSDN WebCast 《C#面向对象设计形式纵横谈》 助教:李建忠
  • 刘伟先生. 设计情势. 巴黎:南开东军事和政院学出版社, 二零一一.
  • 刘伟(Liu-Wei). 设计情势实验和培养和练习教程. 新加坡:北大学院出版社, 二〇一二.
  • 《大话设计方式》 作者: 程杰 南开东军政高校学出版社
  • 《C#图解教程》我: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
  • 《你不可能不驾驭的.NET》小编: 王涛
  • 《项目中的.NET》小编: 李天平 电子工业出版社
  • 《Microsoft .NET集团级应用架构划设想计》我: (美)埃斯波西托等创作
    译者: 陈黎夫
  • http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
  • http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
  • http://www.cnblogs.com/terrylee 博客笔者:李会军
  • http://www.cnblogs.com/anlyren/ 博客作者:anlyren
  • http://www.cnblogs.com/idior 博客作者:idior
  • http://www.cnblogs.com/allenlooplee 博客小编:阿伦 lee
  • http://blog.csdn.net/ai92 博客作者:ai92
  • http://www.cnblogs.com/umlonline/ 博客作者:张传波
  • http://www.cnblogs.com/lovecherry/ 博客笔者:LoveCherry

格局分析
模板方法格局是一品类的行为型形式,在它的布局图中唯有类之间的存在延续关系,没有对象关联关系。
在模板方法情势的利用进度中,须要支付抽象类和支付具体子类的设计师之间进行同盟。贰个设计师负责给出2个算法的概貌和骨架,另一些设计师则承担给出那几个算法的各类逻辑步骤。完结这个现实逻辑步骤的措施称为基本方法(Primitive
Method),而将这一个基本法方法汇总起来的不二法门称为模板方法(Template
Method),模板方法情势的名字之后而来。

格局优缺点
迭代器格局的独到之处
 它支持以分裂的章程遍历二个集合对象。
 迭代器简化了聚合类。
 在同1个会师上能够有多个遍历。

在迭代器方式中,增添新的聚合类和迭代器类都很便利,无须修改原有代码,满意“开闭原则”的渴求。
迭代器格局的短处

由于迭代器情势将积存数据和遍历数据的职分分开,增加新的聚合类要求对应扩展新的迭代器类,类的个数成对扩大,那在大势所趋水平上扩展了系统的复杂。

各位园友,我们好,作者是Bobby,在念书OOAD和开发的档次的历程中有一些觉醒和设法,整理和编写制定了部分学习质感

TestPaperA.cs

namespace IteratorPattern
{
    //Iterator迭代器抽象类
    abstract class Iterator
    {
        //用于定义得到开始对象、得到下一个对象、
        //判断是否到结尾、当前对象等抽象方法,统一接口
        public abstract object First();
        public abstract object Next();
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
}

【内容简介】
操纵某种开发语言,让您兑现了由零到一的脱变,倘使你能控制OOAD并能活用OOAD,则能让您兑现由一到十的高效!知道OOAD的人居多,能在其实工作中用好OOAD的人却不多,本书为您分享小编十多年来施行OOAD的心体面会,学会活用OOAD来进步须要分析及软件设计的能力,学会活用OOAD由要求到设计全程建立模型。
正仿佛,技术是条永无边无际的路,各种人总得不断更新才能维持充实;《OOAD与UML那一点儿事》并不是一本万能大百科,那里没有具备难点的答案,能够化解您身边主要的怀疑,就曾经是作者乐意的靶子了。从专题动手,将二个个要害、难题和疑问从深刻角度抓住本质。

using System;

namespace TemplateMethodPattern
{
    //学生乙抄的试卷
    class TestPaperB : TestPaper
    {
        //试题1
        public new void TestQuestion1()
        {
            base.TestQuestion1();
        }
        //试题2
        public new void TestQuestion2()
        {
            base.TestQuestion2();
        }
        //试题3
        public new void TestQuestion3()
        {
            base.TestQuestion3();
        }
        protected override string Answer1()
        {
            return "d";
        }
        protected override string Answer2()
        {
            return "b";
        }
        protected override string Answer3()
        {
            return "a";
        }
    }
}

【注明与感激】
本文,站在众多巨人的肩膀上,借鉴和引用了众多旁人拥有版权的著述或撰文,在此,对前人们的进献致谢。并同时发布引用的剧情、原作者或出自(一些来源于互连网的始末本身无法追述本源,深表遗憾)。

【参考文献】

模板方法格局的欠缺

每一个不一致的落到实处都亟待定义1个子类,那会导致类的个数扩充,系统越发庞大,设计也尤为空虚,可是越来越符合“单一职分规范”,使得类的内聚性得以升高。

namespace IteratorPattern
{
    //Aggregate聚集抽象类
    abstract class Aggregate
    {
        //创建迭代器
        public abstract Iterator CreateIterator();
    }
}

 

【注解与谢谢】
正文,站在无数壮汉的肩膀上,借鉴和引用了累累客人拥有版权的文章或撰文,在此,对前人们的进献致谢。并同时发表引用的剧情、原我或缘于(一些出自网络的始末作者无法追述本源,深表遗憾)。

格局分析
聚拢是多少个管制和集体数据对象的数据结构。
会面对象首要持有多少个职务:一是储存个中数据;二是遍历内部数据。
仓库储存数据是聚众对象最宗旨的天职。
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的里边数据,那正是迭代器格局的真面目。迭代器情势是“单一任务规范”的应有尽有展现。

  1. 【OOAD】OOAD概述
  2. 【OOAD】OOP的重中之重特色
  3. 【OOAD】面向对象设计原则概述
  4. 【OOAD】设计情势概述
  5. 通俗设计格局——简单工厂情势(Simple
    Factory)
  6. 浅显设计格局——工厂方法情势(Factory
    Method)
  7. 起初设计形式——抽象工厂形式(Abstract
    Factory)
  8. 通俗设计格局——建造者方式(Builder
    Pattern)
  9. 初阶设计格局——原型方式(Prototype
    Pattern)
  10. 深入浅出设计形式——单例格局(Singleton
    Pattern)
  11. 浅显设计情势——适配器方式(Adapter
    Pattern)
  12. 开首设计格局——桥接方式(Bridge
    Pattern)
  13. 通俗设计方式——组合方式(Composite
    Pattern)
  14. 浅显设计情势——装饰形式(Decorator
    帕特tern)
  15. 浓密浅出设计方式——外观情势(Facade
    Pattern)
  16. 浅显设计情势——享元方式(Flyweight
    Pattern)
  17. 早先设计情势——代理格局(Proxy
    Pattern)
  18. 通俗设计形式——任务链情势(Chain
    of Responsibility
    Pattern)
  19. 起首设计方式——命令形式(Command
    Pattern)
  20. 深刻浅出设计形式——解释器形式(Interpreter
    Pattern)
  21. 浅显设计情势——迭代器形式(Iterator
    Pattern)
  22. 伊始设计情势——中介者情势(Mediator
    Pattern)
  23. 通俗设计形式——备忘录情势(Memento
    Pattern)
  24. 浅显设计形式——观察者方式(Observer
    Pattern)
  25. 深刻浅出设计方式——状态格局(State
    Pattern)
  26. 通俗设计情势——策略情势(Strategy
    Pattern)
  27. 起头设计形式——模板方法形式(Template
    Method
    Pattern)
  28. 深远浅出设计方式——访问者格局(Visitor
    Pattern)

格局适用条件
在以下情状下能够选拔模板方法格局:
 2次性落成3个算法的不变的有的,并将可变的作为留给子类来落实。
 各子类中集体的所作所为应被提取出来并汇总到三个公家父类中以幸免代码重复。

对有些繁杂的算法进行划分,将其算法中稳定不变的一部分设计为模板方法和父类具体方法,而有的足以更改的底细由其子类来完毕。
 控制子类的扩充。

Aggregate: 抽象聚合类


模板方法情势是依照继承的代码复用基本技能,模板方法格局的构造和用法也是面向对象设计的主旨之一。在模板方法情势中,可以将一如既往的代码放在父类中,而将分歧的法门达成放在不一致的子类中。
在模板方法形式中,大家需求预备二个抽象类,将某些逻辑以具体方法以及具体构造函数的花样落到实处,然后声多美滋些空洞方法来让子类完结多余的逻辑。不一样的子类能够以不一致的点子贯彻那个抽象方法,从而对剩下的逻辑有两样的落到实处,那正是模板方法格局的意图。模板方法形式展示了面向对象的重重根本思想,是一种采用功用较高的格局。

【参考文献】
《设计格局—可复用面向对象软件的根底》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—革新既有代码的统一筹划》小编: Martin Fowler译者:候捷
中华夏族民共和国电力出版社
《敏捷软件开发—原则、格局与实践》作者: 罗Bert C. 马丁 哈工大东军事和政院学出版社
《程序员修炼之道—从小工到学者》小编: Andrew Hunt / 戴维 Thomas电子工业出版社
《Head First 设计形式》小编: 弗里曼 译者: O’Reilly Taiwan公司中国电力出版社
《设计情势之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计方式纵横谈》 教授:李建忠
刘伟(Liu-Wei). 设计形式. 法国首都:浙大东军事和政院学出版社, 二零一一.
刘伟先生. 设计形式实验和培养和磨练教程. 香江:哈工大东军事和政院学出版社, 二〇一一.
《大话设计方式》 我: 程杰 哈工业余大学学东军事和政院学出版社
《C#图解教程》笔者: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你必须精通的.NET》小编: 王涛
《项目中的.NET》我: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构设计》作者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客笔者:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客笔者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客笔者:Allen lee
http://blog.csdn.net/ai92 博客作者:ai92
http://www.cnblogs.com/umlonline/ 博客小编:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:乐福Cherry


设计形式篇

【参考文献】
澳门威尼斯人网址,《设计情势—可复用面向对象软件的底子》笔者: [美] Erich Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改正既有代码的设计》笔者: 马丁 Fowler译者:候捷
中夏族民共和国电力出版社
《敏捷软件开发—原则、方式与实践》小编: 罗Bert C. 马丁 清华大学出版社
《程序员修炼之道—从小工到学者》作者: Andrew Hunt / David 托马斯电子工业出版社
《Head First 设计情势》作者: Freeman 译者: O’Reilly Taiwan公司中夏族民共和国电力出版社
《设计形式之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计形式纵横谈》 教师:李建忠
刘伟(Liu-Wei). 设计方式. 香港(Hong Kong):浙大东军事和政院学出版社, 二〇一三.
刘伟(Liu-Wei). 设计形式实训教程. 巴黎:南开东军大学出版社, 二〇一三.
《大话设计情势》 作者: 程杰 清华东军事和政院学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你不能够不清楚的.NET》作者: 王涛
《项目中的.NET》小编: 李天平 电子工业出版社
《Microsoft .NET公司级应用框架结构划设想计》笔者: (美)埃斯波西托等创作 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客作者:李会军
http://www.cnblogs.com/anlyren/ 博客笔者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客我:Allen lee
http://blog.csdn.net/ai92 博客小编:ai92
http://www.cnblogs.com/umlonline/ 博客笔者:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:LoveCherry

using System;
using System.Collections.Generic;

namespace IteratorPattern
{
    //ConcreteAggregate具体聚集类 继承Aggregate
    class ConcreteAggregate : Aggregate
    {
        //声明一个IList泛型变量,用于存放聚合对象,用ArrayList同样可以实现
        private IList<object> items = new List<Object>();
        public override Iterator CreateIterator()
        {
            return new ConcreteIterator(this);
        }
        public int Count
        {
            get { return items.Count; }//返回聚集总个数
        }
        //声明一个索引器
        public object this[int index]
        {
            get { return items[index]; }
            set { items.Insert(index, value); }
        }
    }
}

重中之重字:OOAD、UML、设计格局

方式实例与分析
试题抄错会做也白搭—模板方法形式
系统布局
澳门威尼斯人网址 1
TestPaper.cs

形式动机
澳门威尼斯人网址 2

情势实例与分析 示例代码下载

Client:客户类

Client:客户类

遏制能力简单,有些不留意的一无所长在所难免,那里的仇敌们,如若发现别的不当与不当,烦请及时汇报给本身,那是最大的帮助和鼓励。

using System;

namespace TemplateMethodPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("学生甲抄的试卷:");
            TestPaper studentA = new TestPaperA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();

            Console.WriteLine("学生乙抄的试卷:");
            TestPaper studentB = new TestPaperB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion3();

            Console.Read();
        }
    }
}

方式实例与分析
想走?能够!先购票—迭代器形式示例
系统布局
澳门威尼斯人网址 3
Iterator: 抽象迭代器

模板方法:3个模板方法是概念在抽象类中的、把基本操作方法结合在同步形成二个总算法或2个总作为的法门。
基本情势:基本格局是贯彻算法各类步骤的不二法门,是模板方法的组成都部队分。
 抽象方法(Abstract Method)
 具体方法(Concrete Method)
 钩子方法(Hook Method):“挂钩”方法和空方法

using System;

namespace IteratorPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "张三";
            a[1] = "李四";
            a[2] = "王五";

            Iterator i = new ConcreteIterator(a);
            object item = i.First();
            while (!i.IsDone())
            {
                Console.WriteLine("{0} 请买车票!", i.CurrentItem());
                i.Next();//下一乘客
            }
            Console.Read();
        }
    }
}

方式动机
澳门威尼斯人网址 4

using System;

namespace IteratorPattern
{
    //ConcreteIterator具体迭代器类,继承Iterator
    class ConcreteIterator : Iterator
    {
        //定义一个具体聚集对象
        private ConcreteAggregate aggregate;
        private int current = 0;        
        //初始化时将具体的聚集对象传入
        public ConcreteIterator(ConcreteAggregate aggregate)
        {
            this.aggregate = aggregate;
        }
        public override object First()
        {
            return aggregate[0];
        }
        public override object Next()
        {
            Object ret = null;
            current++;
            if (current < aggregate.Count)
            {
                ret = aggregate[current];
            }
            return ret;
        }
        public override bool IsDone()
        {
            return current >= aggregate.Count ? true : false;
        }
        public override object CurrentItem()
        {
            return aggregate[current];//返回当前的聚集对象
        }
    }
}

方式社团
模板方法格局涵盖如下剧中人物:
AbstractClass: 抽象类
ConcreteClass: 具体子类

形式适用条件
在以下意况下得以采用迭代器方式:
 访问二个晤面对象的剧情而无须暴光它的里边表示。
 要求为汇聚对象提供各类遍历格局。
 为遍历分裂的汇聚结构提供1个合并的接口。

方式优缺点
模板方法方式的亮点
 模板方法方式在一个类中方式化地定义算法,而由它的子类达成细节的处理。
 模板方法方式是一种代码复用的骨干技术。

模板方法形式导致一种反向的控制结构,通过2个父类调用其子类的操作,通过对子类的壮大扩展新的行事,符合“开闭原则”。

形式社团
迭代器形式涵盖如下剧中人物:
Iterator: 抽象迭代器
ConcreteIterator: 具体迭代器
Aggregate: 抽象聚合类
ConcreteAggregate: 具体聚合类

TestPaperB.cs

贰个凑合对象,如三个列表(List)或然二个会合(Set),应该提供一种办法来让别人能够访问它的因素,而又不必要揭露它的内部结构。
本着不一样的内需,只怕还要以分裂的方法遍历整个聚合对象,不过大家并不期望在集结对象的抽象层接口中充斥着种种分裂遍历的操作。
什么样遍历三个集结对象,又不要求精通聚合对象的内部结构,仍是能够够提供两种分化的遍历格局,这便是迭代器格局所要消除的题材。
在迭代器形式中,提供叁个外表的迭代器来对聚集对象开始展览走访和遍历,迭代器定义了1个拜访该聚合成分的接口,并且能够跟踪当前遍历的要素,掌握怎样因素已经遍历过而哪些没有。
有了迭代器方式,我们会发现对3个叶影参差的聚合对象的操作会变得那样回顾。

在模板方法方式中,由于面向对象的多态性,子类对象在运维时将掩盖父类对象,子类中定义的方法也将覆盖父类中定义的法子,由此先后在运行时,具体子类的着力形式将覆盖父类中定义的为主方法,子类的钩方法也将掩盖父类的钩子方法,从而得以经过在子类中贯彻的钩方法对父类方法的实行举行封锁,完成子类对父类行为的反向决定。

在迭代器形式中央银行使了工厂方法形式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩大性很好,在客户端能够针对抽象聚合类和浮泛迭代器举办编制程序。
鉴于广大编制程序语言的类库都曾经达成了迭代器方式,由此在实际上选择中大家很少自定义迭代器,只要求直接行使Java、C#等语言中已定义好的迭代器即可,迭代器已经变为大家操作聚合对象的基本工具之一。

using System;

namespace TemplateMethodPattern
{
    //金庸小说考题试卷
    class TestPaper
    {
        //试题1
        public void TestQuestion1()
        {
            Console.WriteLine("杨过得到,后来给了,炼成倚天剑、屠龙刀的玄铁是[] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维");
            Console.WriteLine("答案:" + Answer1());
        }
        //试题2
        public void TestQuestion2()
        {
            Console.WriteLine("杨过、程英、陆无双铲除了情花,造成[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化");
            Console.WriteLine("答案:" + Answer2());
        }
        //试题3
        public void TestQuestion3()
        {
            Console.WriteLine("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对");
            Console.WriteLine("答案:" + Answer3());
        }

        protected virtual string Answer1()
        {
            return "";
        }
        protected virtual string Answer2()
        {
            return "";
        }
        protected virtual string Answer3()
        {
            return "";
        }
    }
}

ConcreteAggregate: 具体聚合类

using System;

namespace TemplateMethodPattern
{
    //学生甲抄的试卷
    class TestPaperA : TestPaper
    {
        //试题1
        public new void TestQuestion1()
        {
            base.TestQuestion1();
        }
        //试题2
        public new void TestQuestion2()
        {
            base.TestQuestion2();
        }
        //试题3
        public new void TestQuestion3()
        {
            base.TestQuestion3();
        }
        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "a";
        }
        protected override string Answer3()
        {
            return "c";
        }
    }
}

ConcreteIterator: 具体迭代器

方式定义
模板方法方式(Template Method
Pattern):定义3个操作中算法的骨架,而将一部分步骤延迟到子类中,模板方法使得子类能够不更改一个算法的结构即可重定义该算法的少数特定步骤。模板方法是一连串行为型格局
Template Method Pattern: Define the skeleton of an algorithm in an
operation, deferring some steps to subclasses. Template Method lets
subclasses redefine certain steps of an algorithm without changing the
algorithm’s structure.
Frequency of use: medium
UML图
澳门威尼斯人网址 5

情势定义
迭代器情势(Iterator Pattern)
:提供一种方法来做客聚合对象,而不用暴光那些指标的里边表示,其外号为游标(Cursor)。迭代器方式是一种对象行为型形式。
Iterator Pattern: Provide a way to access the elements of an aggregate
object sequentially without exposing its underlying representation.
Frequency of use: high
UML图
澳门威尼斯人网址 6

相关文章