设计模式的视频课程今天算是告一段落,视频+《大话设计模式》+ GoF的粗浅学习,还需要日后的练习应用。学习期间留下一段杂乱摘要笔记,供自己温故知新和增删整改。
=====================================================================================
0. 单项沟通:A为B服务,则A需要知道B能干什么,但B不需要知道A;不要跨越层次调用功能
0. 语言以外的接口,指的是类的对外的行为,比如公开方法属性事件索引器
0. 工厂:将复杂的创建与表现(使用)分离,客户端类不知道他所必须创建的对象的具体类的时候,只创建父类对象,具体多态成哪种具体类,交给工厂
------------------------ 创建型 ----------------------------------
0. 工厂方法:产品父类,产品子类;工厂父类,工厂子类。增加新产品就需要增加新的产品子类和新的工厂子类,平行继承问题,无法解决。
1. 【唯一】:单例模式:唯一,全局访问点
1)饿汉:静态先创建;懒汉:调用再创建
2)多线程访问:加线程锁Lock,两层判断null,第一层为性能,第二层为判断
3)单例和静态类在内存中都只有一个对象,单例对象可释放,静态只能等程序结束才可释放
2. 【多选一】简单工厂:。多个类型选择一个来创建,将创建对象的职责委托给一个全局创建点
1)创建多个实例,可能用到switch的情况,提取出来放到工厂类。一类产品的创建交给一个工厂来做。
2)不用switch,依赖注入(构造子注入、设值注入、配置注入),所依赖的东西由外界(客户端)传进来。如应该创建“什么类型”的实例,类型用反射来提供。
3)工厂生成的是产品,创建者生成的是部件。
3. 【系列】:抽象工厂:多选多。
1)抽象工厂创建产品1产品2,子工厂按照系列化来生产特定系列的产品1产品2
2)抽象工厂不派生,工厂中增加系列字段,利用反射来创建产品1产品2
3)工厂生成的是产品,创建者生成的是部件。
4. 【克隆】:原型模式:克隆对象,.Net可直接实现ICloneable接口,其他平台需手写IClone<>接口
0)适用性:当一个系统应该独立于他的产品创建、构成、表示时,要使用原型模式
1)当要实例化的类是在运行时刻指定,比如动态装载,或者
2)为了避免创建一个与产品类层次平行的工厂类层次时,或者
3)当一个类的实例只能有几个不同状态(成员赋值)组合中的一种时。建立相应数目的原型并克隆。
4)浅拷贝、深拷贝
5)需要深拷贝的引用型成员,其类型也应该实现ICloneable接口
5. 【组装】:创建者(生成器)模式:创建复杂对象(成员也有类等),结构稳定,组成结构的具体对象是变化的
0)例如:同样是车构造,不同品牌部件不同;同样是8件套装,T1和T2
1)同样的构建过程可以创建不同的表示
2)创建、构建(组装)、表示(客户)分开;构建过程是稳定的,有新增套装则新增生成器
3)工厂生成的是独立的产品,创建者生成的是套装的部件。
------------------------ 结构型 ----------------------------------
6. 【转接】适配器模式:对象复用,新旧兼容
1)功能一致的两个类,接口不同,不可直接复用,增加适配器类进行接口包装转换,使可以兼容
2)预先合理设计、发现问题及时重构,可以避免使用适配器
3)类适配器通过多重继承实现,.Net java等不支持
4)对象适配器
5)例子:Resources.Load类,传参和返回与需求不符,增加ResourcesManager类,对其进行包装
6)例子:技能外观类中,无参施放方法包装了有参施放方法,并复用了skillManager
7. 【向导】外观模式:组织系统,简化调用
0)对内高内聚,对外低耦合
1)为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口让子系统更易用
2)外观模式可有可无;简化客户调用;解耦客户端与实现子类间的依赖性;层次结构(比如MVC)中定义每一层子系统入口,子系统之间相互依赖则可让子系统通过外观通信
3)个人炒多支股票是一组子系统,购买基金间接买卖股票是外观
4)例子:技能外观类中,AttackUseSkill
8. 【连接】桥接模式:依赖抽象,连接两端的变化
1) 将抽象部分与实现部分分离,使他们可以独立变化;解决排列组合的情况
2) 例子:技能施放器,选择目标的算法() 与 施放技能的模式() 都可能变化
9. 【包装】装饰模式:动态为对象(而不是类)增加额外功能,接口要一致;将主要方法以串联方式逐一增加给主目标(一层层装饰)
1)不更换引用,不更换接口:所以具体组件类和装饰器类都要继承同一个组件父类,同事装饰器要聚合父类;具体装饰器要保留父类功能,再新增自己的功能
2)如果没有共同的组件父类,可让具体组件类作为装饰器类的父类
3)装饰器聚合父类,可用构造方法传入,可用Set传入
4)在装饰器类中加入拆包装功能:一层层包装,一层层拆包装
5)给对象加功能,不考虑统一的接口,可以使用委托回调
6)行为叠加就叠加方法,数据叠加就叠加值
7)例子:StreamReader(new FileStream),用StreamReader包装一个FileStream对象
8)例子:不影响行为,影响数值的装饰:角色 + 装备
9)适用性
1>不影响其他对象的情况下,动态、透明地给单个对象添加职责
2>处理可以撤销的职责
3>不能采用派生的方法来扩充时
10. 【树】组合模式:树形层次关系
1)树枝无限层次实现,自己包含自己:List<ThisClass> list;树叶不包含自己。
2)不让客户为难,所以树叶和树枝都继承于根
3)简化版,现有层次,再判断枝叶;无分支则认为是Leaf,TreeNode类,List<TreeNode> list, IsLeaf{get{return nodes.Count == 0;}}
4)例子:电商的商品类别,无限层次,增加父类别编号属性
5)例子:固定类别层次
11. 【幌子】代理模式
1)对一个对象进行访问控制
2)适用性
1>远程代理:本地创建代理访问远程
2>虚代理:根据需要创建开销很大的对象的代理(缩略图、压缩)
3>保护代理:控制对原始对象的访问,对象拥有不同的访问权限
4>智能指引:取代了简单的指针,访问对象时执行一些附加操作
1)对指向实际对象的引用计数,该对象无引用时可以自动释放 (GC)
2)第一次访问一个持久化对象,将其放入内存(缓存)
3)访问一个实际对象前,确定其是否已被锁定,确保其他对象不可修改他(lock)
2. 例子:立即可查看的小图片,代理真正的大图
12. 享元模式
------------------------ 行为型 ----------------------------------
13. 【通知,自动更新】观察者模式:一对多交互,依赖倒置,抽象通知者,抽象观察者。
1)事件为发布者,事件注册即为添加观察者
2)例子:事件,一对多的通知,一方通知,多方订阅;通知者不知道都谁订阅,订阅者互相不认识,订阅后行为不尽相同。
3)Attach、Detach,用List放观察者;注册、减注册,用event注册观察者
14. 【交流平台】中介者模式:多对多交互,中介调停者
1)例子:联合国抽象中介者,联合国安理会具体中介者,国家抽象参与者,中美具体参与者
15. 【切换算法】策略模式:关注算法切换的问题,无前置条件,就是改变
1)算法独立封装,可相互替换,独立于客户;客户依赖于抽象策略接口
2)例子:不同岗位算工资,封装不同算法
3)例子:攻击选择器,封装选择算法
16. 【状态决定行为】状态模式:对象状态变化时改变他的行为,有条件地改变,如升级了就跑着走
1)模式结构与策略模式相同,引入委托/事件 回调
17. 【骨架】模板方法:定义一个操作中的算法骨架,将特定步骤延迟到子类。
1)就是模板,在父类中最大化提炼代码,派生类只写不同的地方
2)模板方法用抽象方法或虚方法
3)骨架、调用逻辑为模板,具体实现和细节交给派生类
18. 备忘录:记录一个对象的临时状态,游戏存档
19. 迭代器:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示
1)结构:First(), Next(), IsDone(), CurrentItem()
2)例子:Foreach、yield return、IEnumerator
20. 职责链
21. 命令模式
22. 解释器
23. 访问者