• 8月工作杂记


    8.17

    上午

    改不规范的老代码,

    下午

    遇到一个最近访问列表Bmp刷新有问题,但我用了将近2个小时才必现了问题。

    晚上

    工厂模式

    工厂方法: 实例化延迟到子类
    NN项目中有一个简单的工厂方法,主要思想就是把对象的创建封装进了工厂中,对具体客户类实现了对象创建细节的屏蔽。
    抽象工厂: 一套产品

    单例模式

    全局对象在程序一开始的时候就创建了,如果一段时间没有使用,会耗费资源。单例模式在需要用到的时候才创建。——延迟实例化
    构造函数私有化——“鸡生蛋”还是“蛋生鸡”

    多线程情况下:
    加锁是一种解决方法,但是除了第一次以外,以后每次都不需要锁了,性能下降较多
    急切创建实例,声明静态变量即初始化——耗费资源
    双重检查加锁

    单例可以设计成泛型类,项目中方便使用
    FTBaseAPI的延迟初始化的单例泛型是什么鬼,没看懂……

    8.18

    上午:

    策略模式:
    如果每次新的需求一来,都会使某方面的代码发生变化——封装起来:
    比如某个菜单,它的菜单项可能是会经常修改的。

    现状: 鸭子基类放太多函数,子类不一定要用到,每加入一个子类就得改。
    如果把鸭子基类的函数外放接口让各个子类继承,每个子类中存在的重复代码又太多了!
    以上两种做法,都把行为放进了鸭子类中实现
    根本点就是: 飞和叫的函数随着具体鸭子的不同而改变。

    行为“外包”给行为对象,鸭子和“行为对象”组合在一起,还可以动态改变。

    《Head First》中的最后代码,子类中仍然是面对实现编程,个人认为可以加上一个工厂模式去创建不同的Beaviour类,屏蔽对象创建的细节!

    下午

    观察者模式

    1. 观察者模式的代表人物: MVC
    2. 观察者模式有“推”和“拉”两种,“推”一般是自己在通知函数加入参数,“拉”一般是通知观察者,让观察者调用被观察者的Getter方法获取数据。
      “推”数据的缺点——以后这些数据的类型和个数是可能要变化的,这个变化没有被很好的封装
    3. 许多GUI框架都使用着观察者模式。
    4. 观察者模式将许多观察者“组合”进被观察者中,符合“多用组合,少用继承”的设计原则。

    装饰模式

    “组合”和“委托”可以在运行时具有继承行为的效果
    继承设计子类,行为是在编译时静态决定的,所有子类会继承到相同的行为。利用组合的做法,可以在运行时动态地进行扩展。
    装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
    对象可以在任何时候被装饰,运行时动态地,不限量地用装饰者来装饰对象。
    利用继承得到“类型匹配”,而不是利用继承得到“行为"。

    利用”工厂“和”生成器“设计模式,将有更好的方法建立被装饰者对象。
    装饰模式的缺点:

    1. 有很多小类,容易造成困扰。
    2. 不能依赖特殊的子类类型做特定的操作,都是统一使用基类的函数接口。
      3.《Head First》中的例子的次序是有一定规律的,”饮料类“是必须在最里层的,”调料类“的次序无关紧要——这点在加入”调料价格根据咖啡容量大小改变"的扩展中会有涉及。

    8.20

    上午

    随便看看需求

    下午

    需求预审,编码规范PPT

    晚上

    技术分享会议
    命令模式

    • 分为四个角色: 客户,调用者,命令对象,接收者,分别对应于: 顾客,服务员,订单,厨师
    • 可以实现undo操作的方法通常是“记录以前的状态”
    • 缺点是:会生成许多的命令子类
      学习到了持有——也就是有一个成员变量,这个是编译时期决定的,和观察者模式的动态注册相对应

    对象的序列化 与 对象的持久化??

    8.27

    写一个继承CWind的类,CWind的m_hwnd怎么一直是NULL,要如何赋值?
    需要学习C++11的lamba表达式

    8.9月之交

    适配器模式——转换接口,为了兼容性
    有对象适配器和类适配器,类适配器需要用到多重继承
    外观模式——统一和简化接口,就是传说中的“把这些代码封装成一个函数啊!”

    1. 适配器将一个对象包装起来以改变其接口
    2. 装饰器将一个对象包装起来以增加新的行为和责任
    3. 外观将一群对象"包装"起来以简化其接口

    9.06

    设计模式之“最少知识原则”:
    在一个对象的方法之内,应该只调用属于以下范围的方法:

    1. 该对象本身
    2. 被当作方法的参数而传递进来的对象
    3. 此方法所创建或实例化的任何对象
    4. 对象的任何组件(has-a的关系)

    9.08

    模板方法模式

    定义了算法的步骤,把部分步骤的实现延迟到子类

    类似的,C++的sort中需要传入对象重载 < 操作符,其实也是使用模板方法模式

    策略模式

    策略模式和模板方法模式都封装了算法,一个用组合,一个用继承
    工厂方法是模板方法的一种特殊版本

    迭代器模式

    单一责任: 一个类应该只有一个引起变化的原因
    一个模块或者一个类被设计成只支持一组相关的功能时,我们就说它具有高内聚
    提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示

    组合模式

    将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。

    9.09

    状态模式

    代理模式

    代理模式 和 装饰者模式:目的不一样,装饰者为对象增加行为,而代理是控制对象的访问。
    代理模式 和 适配器模式:代理和适配器都是挡在其他对象的前面,并负责将请求转发给它们,适配器会改变对象适配的接口,而代理则实现相同的接口。

    复合模式

    MVC

    1. 模型对视图和控制器是一无所知的,它们之间是完全解耦的。
    2. 控制器是视图的“策略”(策略模式)

    桥接模式

    访问者模式

    对于对象组合,访问者可以调用每个对象的GetState方法,参数是该对象的引用,访问者就可以随意调用该对象的任意方法,操作的改变都封装到了访问者类中。
    不过缺点就是破坏了被访问者的封装性。

  • 相关阅读:
    爱普生L4168打印出来是白纸,复印OK,打印机测试也OK 解决方案
    json序列化对象
    "割裂"的西安
    资金投资心得
    【练内功,促成长】算法学习(3) 二分查找
    在ReactNative中实现Portal
    node创建GIT分支,并修改代码提交
    关于"三分钟热度"问题的思考
    参考vue-cli实现自己的命令行工具(demo)
    【练内功,促成长】算法学习(2) 排序算法
  • 原文地址:https://www.cnblogs.com/HelloGreen/p/9496718.html
Copyright © 2020-2023  润新知