0%

引子

异步线程调用

异步调用线程,线程消息回调主线程

其他线程 作为生产者产出消息,主线程作为消费者 消费其他线程的产出

多个线程之间消息传递

示例 渲染系统,将渲染任务交给Render线程,将数据收集交给Collect线程

主线程(传递消息到Render线程) -> 渲染任务(消息告诉Collect线程去收集需要的信息) -> Collect任务(消息传递到Render线程) -> 渲染任务执行-> 执行完成以后消息(传递消息到主线程) -> 主线程执行下一帧循环

需要 几个 消费队列

  1. 主线程消费队列
    • 渲染任务完成消息
  2. Render 线程消费队列
    • 主线程渲染任务
    • Collect线程渲染信息
  3. Collect 线程消费队列
    • 渲染线程需要收集什么信息

要保证Render线程和Collect线程处于激活状态

阅读全文 »

引子

汇编程序运行需要什么

环境

安装

首先将 DosBoxMasm 下载下来
安装DosBox ,DosBox 就是运行汇编的环境

汇编是个比较古老的东西,Masm 需要在 DosBox上才能运行

所以用它来运行

然后 新建一个 汇编的工程目录 如 :

1
e:/projects/asms/

这个目录以后专门放汇编的程序代码

将编译器放入 这个目录下面

1
e:/projects/asms/masm

如下

阅读全文 »

引子

设计模式的六大原则

1. 总述

软件设计模式使人们可以更加简单方便复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、模式角色、合作关系、实现方法、实用性、已知应用、例程、模式扩展和相关模式等。

设计模式有两种分类方法,一种根据模式的目的来分;另一种根据模式的作用来分。

1.1 根据模式的目的划分

根据模式是用来完成什么样的工作来划分,这种方法可分为创建型模式、结构型模式、行为型模式3种。

1.1.1 创建型模式

用于描述“怎么创建对象”。它的主要特点是“将对象的创建与使用分离”。如,单例、原型、工厂方法、抽象工厂、建造者等5种创建型模式。

1.1.2 结构型模式

用于描述“如何将类或对象按某种布局组成更大的结构”。如,代理、适配器、桥接、装饰、外观、享元、组合等7种结构型模式。

1.1.3 行为型模式

用于描述“类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责”。如,模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录模式、解释器等11中行为模式。

阅读全文 »

引子

设计模式的六大原则

创建型设计模式

创建型设计模式的主要关注点是“怎么创建对象”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建有相关的工厂来完成。就像我们去商城购买商品时,不需要知道商品是怎么深处出来的一样,因为它们由专业的厂商生产。

创建型模式分为以下几种:

  • 单例(Singleton)模式:某个类只能生成一个实例,该实例提供一个全局访问店供外部获取该对象,其扩展时有限多例模式。
  • 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类型的新实例。
  • 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,有子类决定生产什么产品。
  • 抽象工厂(Abstract Factory)模式:提供一个创建产品族的接口,其每个子类可以生产一些列相关的产品。
  • 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建从复杂对象。
    以上 5 种创建型模式,处理工厂方法模式属于(类)创建型模式,其他的全部属于(对象)创建模式。
    阅读全文 »

引子

设计模式的六大原则

行为型设计模式

行为性设计模式描述 类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责

1)模板方法模式(Template Method)
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特点步骤。

2)策略模式(Strategy)
定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响算法的客户。

3)命令模式(Command)
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。

4)职责链模式(Chain of Responsibility)
把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这个方式去除对象之间的耦合。

5)状态模式(State)
允许一个对象在其内部状态发生改变时改变其行为能力。

6)观察者模式(Observer)
多个对象间存在一对多的关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其它对象的行为。

7)中介者模式(Mediator)
定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象的耦合度,使原有对象之间不必户互了解。

8)迭代器模式(Iterator)
提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

9)访问者模式(Visitor)
在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象。

10)备忘录模式(Memento)
在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后回复它。

11)解释器模式(Interpreter)
提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

阅读全文 »

引子

命令模式(Command)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。

阅读全文 »

引子

职责链模式(Chain of Responsibility)

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用:在处理消息的时候以过滤很多道。

如何解决:拦截的类都实现统一接口。

关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

阅读全文 »

引子

在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。

既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:

  1. 暴露了聚合类的内部表示,使其数据不安全;
  2. 增加了客户的负担。

“迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,且满足“单一职责原则”和“开闭原则”,如 Java 中的 Collection、List、Set、Map 等都包含了迭代器。

迭代器模式在生活中应用的比较广泛,比如:物流系统中的传送带,不管传送的是什么物品,都会被打包成一个个箱子,并且有一个统一的二维码。这样我们不需要关心箱子里是什么,在分发时只需要一个个检查发送的目的地即可。再比如,我们平时乘坐交通工具,都是统一刷卡或者刷脸进站,而不需要关心是男性还是女性、是残疾人还是正常人等信息。

阅读全文 »