模版模式(Template)

介绍

模版模式:模版模式在抽象类或父类中抽象出算法步骤作为模版,模版的具体推迟到子类实现。

  • 模版模式在父类或抽象类中定义了一个算法骨架,并在父类或抽象类中实现共同的部分,各个不同的步骤由不同的子类分别实现;

  • 模版模式在父类的算法步骤中定义钩子(hook),在子类中判断并定义一些不是非通用步骤;

  • 模版模式与策略模式的不同之处在于,策略模式是针对多个不同的算法,而模版算法是针对一个算法的不同步骤,在模版模式中,只有一个算法。

场景

  • 多个算法有多个共同之处,但某些步骤略微不同;

  • 各子类步骤顺序一致,但步骤的具体实现有所不同;

实现

1.有发邮件和发短信两种通讯方式
2.它们都需要目标信息,格式化正文、填写发送方信息,但实现不同;
3在信息类中抽象三个步骤,具体的处理方式由两种通讯方式各自实现;
4.发送信息时调用信息类中的发送方式,发送方法会按照顺序自动调用对应的步骤;

迭代器模式(Iterator)

介绍

迭代器模式:迭代器模式允许调用者在不知道类内部实现的情况下遍历类元素。

  • 迭代器接口常用方法有length(),next(),previous(),remove()等;

  • 各类在内部实现迭代器接口,用对应方法操作元素;

  • 调用者不考虑内部实现,调用迭代器接口即可;

场景

·类使用不同的数据结构存储数据;

·需要对不同的数据类型进行遍历等操作;

实现
1.使用slice存储一列战马,使用map存储一列士兵;
2.战马和士兵结构都实现了迭代器接口;
3.获取战马数和士兵数,遍历战马和士兵,调用迭代器接口即可;

组合模式(Composite)

介绍

组合器模式:使用一种组件抽象来同时表达集合与元素,使用统一的接口来管理集合和元素。

  • 组合模式通常为树结构,父节点和子节点具有同样的抽象和接口;

  • 在操作集合时,会同时操作集合所属的具体元素;

  • 通常给组合模式添加一个迭代器来完成组合结构的迭代;

场景

  • 管理的多个对象构成树型层级结构;

  • 操作高层级的对象时,需要同时操作其所属的下级对象,如界面窗口等;

实现

  1. 1.将军、队长、士兵构成树型层级结构,且他们都是战士,拥有战斗方法;<br /> 2.每位展示都保存着自己的下级名单,没有下级时忽略;<br /> 3.每个人在战斗时,都会率领着下级战斗;

状态模式(State)

介绍

状态模式:状态模式抽象出一个事物的状态作为类,解耦事物和不同的状态下的行为;

  • 状态模式通过替换状态对象作为状态转换的方式;

  • 状态对象实现根据状态动作的接口,可以根据不同的动作做出对应的反应;

  • 状态模式和策略模式的实现相似,但状态模式是对类内部状态做出改变,而策略模式是针对算法封装;

场景

  • 事物有多种状态,且可以相互转换;

  • 事物多种状态下对同一动作做出的行为不同;

实现

  1. 1.植物有幼苗、开花和成熟三种状态,且它们会通过浇水和收获的动作进行相互转换;<br /> 2.幼苗和开花时不能收获,只能浇水,成熟状态只能收获,不需要浇水;<br /> 3.定义三种状态,和它们对不同动作时的行为,植物通过三种对象的替换来进行状态转换;

代理模式(Proxy)

介绍

代理模式:给对象提供一个代理,由代理对象控制对原对象的调用;

  • 代理模式为一个对象创建另外一个类作为其访问的接口,所有对真实对象的请求都通过代理当对象完成;

  • 代理模式可以被用作:远程代理、虚拟代理,安全代理,指针引用,延迟加载;

场景

  • 对象无法被直接访问时;

  • 对象过大、初始化较慢;

  • 对象不必要立刻初始化,可使用默认值代替;

实现
1.小名给暗恋对象写了一封信,在等回信;
2.邮递员是个非常忙的人,来不及去收取回信;
3.小名好声好气向快递员要回信时,邮递员都推托说自己要去取;
4.小名发怒了,邮递员终于抽时间去取了信给小名;
5.此信中邮递员就是代理模式中的代理,她实现了懒加载;
6.回信内容见源码

桥接模式(Bridge)

介绍

桥接模式:将事务的多个纬度都抽象出来以解耦抽象与实际之间的绑定关系,使抽象和实际向着不同纬度改变;

  • 桥接模式通过对象的组合来解决事物的多维度变化问题,以替代多继承的不灵活;

  • 桥接模式可以轻易在多维度上扩展,为不改变原有模式;

  • 桥接模式与策略模式的不同之处:策略模式是针对一个不变的主题替换抽象算法,而桥接模式是策略磨死的高纬度状态,它的主题也可能会被替换;

场景

  • 某事物在多个纬度上都有变化;

  • 无法使用多继承或使用多继承会很不灵活;

实现

1.作画时可以使用铅笔和圆珠笔等不同的笔,也可以在宣纸或普通A4纸;
2.抽象出笔和纸两种对象;
3.自由组合笔和纸进行作画;

建造者模式(Builder)

介绍

建造者模式:建造者模式分离创建复杂对象的过程和细节,使得同样的创建过程能创建不同的对象。

  • 建造者模式将创建对象部件的一般过程抽象出接口,而由不同的建造者类实现具体的接口,实现过程的步骤;

  • 通过建造者,调用者不用考虑对象创建过程的细节,而建造者也可以被灵活替换;

  • 与模版模式的区别:建造者模式使用类的组合进行对象的创建,而模版模式使用类的继承实现对象的具体构造;

  • 与工厂模式的区别,工厂模式会返回一个具体类,而建造者模式会建造出一个由多个类组装而成的完整类;

场景

  • 对象的创建包含其他对象为类元素,创建过程复杂;

  • 多个复杂对象的创建过程具有高度相似性;

实现

  1. 1.中国式建筑有金色屋顶和红色大门,而意式建筑有圆顶和白色大门;<br /> 2.中国建筑师和意式建筑师分别擅长建造不同类型的建筑;<br /> 3.我们在盖不同类型的房子时先创建一个建筑师,再用建筑师去创建对应风格的房子;

golang 设计模式(续) - 图1