0%

在极端变化和极端稳定中寻找变化点,并分离它们,在变化点应用设计模式

好的设计模式就是可以满足 应对变化,提高复用

重构获得设计模式是使用设计模式最好的方法,而不是一步到位

1. 组件协作模式

通过晚绑定,实现框架与应用程序间的松耦合,是二者之间协作时常用的模式

Template Method

动机:在软件构建过程中,某一项任务常有稳定的整体操作,但子步骤却有很多改变的需求,或者由于固有的原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现。

  • 一种非常基础的设计模式,利用虚函数机制使程序扩展更加灵活,代码复用的基本实现结构
  • 除了灵活应对子步骤变化,“不要调用父类,让父类调用子类”的反向控制结构是典型应用
  • 被模板设计调用的虚方法可以有实现,也可以没有实现,一般把它们设为protected方法
阅读全文 »

做一点总结

高速缓存运行机制简单介绍

一种层次存储结构,利用时间,空间局部性:

  1. 高速缓存通过 -直接映射高速缓存,-组相联高速缓存,-全相联高速缓存 三种方式在缓存中进行查找。

  2. 如果命中(hit)进行读或写包括write though,write back等方式进行后续处理。

  3. 若没命中(cache miss)有两种可能:冷不命中时执行放置策略,但是放置策略可能引起冲突不命中(即有空位但却不使用),不是空缓存的话会执行替换策略(有LRU,LFU,随机等方法)。同时有write allocate,not write allocate等方式进行后续处理。

  4. 评价高速缓存性能有命中率,不命中率,命中时间,不命中惩罚。

  5. 影响高速缓存性能的有 块的大小,相联度,写策略缓存大小等。

    阅读全文 »

面向对象:

  • 隔离变化
  • 各个类各司其职
  • 对象从语言实现层面是封装了代码和数据,从规格层面对象是一系列可被使用的公共接口,从概念层面对象是某种拥有责任的抽象

1. 依赖倒置原则(DIP)

  • 高层模块(稳定)不应该依赖与底层模块(变化),二者都应该依赖于抽象(稳定)
  • 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)

2. 开放封闭原则(OCP)

  • 对扩展开放,对更改封闭
  • 类模块应该是可扩展的,但是不可修改

3. 单一职责原则(SRP)

  • 一个类应该仅有一个引起它变化的原因
  • 变化的方向隐含着类的责任

4. Liskov替换原则(LSP)

  • 子类必须能够替换它们的基类(IS-A)
  • 继承表达类型抽象

5. 接口隔离原则(ISP)

  • 不应该强迫客户程序依赖它们不用的方法
  • 接口应该小而完备

6. 优先使用对象组合,而不是类继承

  • 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
  • 继承在某种程度上破坏了封装性,子类父类耦合度高
  • 而对象组合则只要求被组合的对象具有良好的接口耦合度低

7. 封装变化点

  • 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合

8. 针对接口编程,而不是针对实现编程

  • 不将变量类型声明为某个特定的具体类,而是声明为某个接口
  • 客户程序无需获知对象的具体类型,只需知道对象所具有的接口
  • 减少系统中各部分的依赖关系,从而实现“高内聚,松耦合”的类型设计方案

只是用来练习Java的一个项目

整体结构如下:

  • 界面显示包 gui:下面又分了5个包
    • frame:存放一个顶级容器来存放所有的面板
    • panel:存放显示各个页面的panel类
    • model:存放2个表格类
    • listener:存放每个panel中触发器的类和一个顶部toolbar触发器类
    • page:存放首页spend中数据的类
  • 存放工具类的包:包括日期处理类,颜色设置类等等
  • 实体类包entity:对3张表进行映射,存放3个类
  • dao类:把实例与数据库中表进行映射,包含一些处理表的数据的方法,其中使用sql命令
  • 业务处理包service:存放业务类,是对dao类的再封装,使得操作表中数据更加的方便
  • startup:存放了一个启动类

几处注意的地方:

  1. entity,dao,service之间的关系:

    Listener ====> Service ====> Dao ====> 数据库

  2. 每一个界面的panel都继承自一个自定义的WorkingPanel类:因为功能相似,所以抽象出一个父类,提供 addListener() 和 updateData() 两个虚方法。

  3. 对常用方法进行封装了形成几个工具类:

  4. 将每个panel中触发器进行封装重写:

  5. 类成员的访问权限

  6. 每个panel都是单例模式

  • 数据读入:

    data=pd.read_csv("E:/all_data.csv, header=None, sep=" "")

  • 数据存储(无表头):

    data.to_csv('E://AmazonData/data.csv', header=None, index=0)

  • 获取每个用户有多少个:

    user_num = pd.DataFrame(user.value_counts())

  • 挑出不满足交易数量为1的用户:

    multi_user = user_num[(~ user_num['user'].isin([1]))]

  • 剪切特定的列:

    new_data = data.loc[data['user'].isin(multi_user.index)]

  • 删除特定的列:

    new_data = new_data.drop(columns=['Unnamed: 0'])

  • 添加特定的列:

    new_counts['userID'] = new_counts.index

  • 画直方图:

    fig, ax = pyplot.subplots(figsize=(20, 6))sns.distplot(amazon_user, ax=ax)