博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式简要笔记
阅读量:4638 次
发布时间:2019-06-09

本文共 3837 字,大约阅读时间需要 12 分钟。

设计模式的视频课程今天算是告一段落,视频+《大话设计模式》+ 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. 访问者

 

转载于:https://www.cnblogs.com/gameobject/p/7811683.html

你可能感兴趣的文章
局域网内通讯APP
查看>>
Unity Shader 图片流光效果实现(纯计算方式)
查看>>
POJ 2002 Squares
查看>>
Java 内存分配
查看>>
ObjectDataSource控件执行Delete操作时,出现“未能找到带参数的非泛型方法”的解决方案...
查看>>
Ubuntu17.10 React Native 环境搭建
查看>>
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
查看>>
jQuery-2.1.4.min.js:4 Uncaught TypeError: Illegal invocation
查看>>
jvm-监控指令-jdump
查看>>
maven安装与配置
查看>>
文件描述符与socket连接
查看>>
学习内容
查看>>
简单的输入法效果(类似百度输入时候的智能检索)
查看>>
springboot+tomcat不同环境采用不同配置文件
查看>>
ubuntu 服务器添加新磁盘
查看>>
嗯,记着
查看>>
linux_redhat9下安装SENDMAIL服务器
查看>>
我刚知道有这么个翻译 记录一下。
查看>>
数据堂:科研数据共享平台, 免费下载, 计算机, 交通数据, 数据挖掘.htm
查看>>
暑假训练Day6
查看>>