09 2022 档案
摘要:不要将设计模式当成算法去学习,初期可以模仿,但更多的它是一种思想 —— 管理变化,提高复用。 两个手段:分解 vs 抽象。 八大原则 依赖倒置原则(DIP) 开放封闭原则(OCP) 单一职责原则(SRP) Liskov 替换原则(LSP) 接口隔离原则(ISP) 对象组合优于类继承 封装变化点 面向
阅读全文
摘要:“领域规则”模式 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式 Interpreter 动机(Motivation) 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用
阅读全文
摘要:“行为变化”模式 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 典型模式 1· Command 2. Visitor 动机(Motivation) 在软件构建过程中,由于需求的改变,某些类
阅读全文
摘要:“行为变化”模式 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 典型模式 1· Command 2. Visitor 动机(Motivation) 在软件构建过程中,“行为请求者”与“行为
阅读全文
摘要:“数据结构”模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型模式 1.Composite 2·Iterator //
阅读全文
摘要:“数据结构”模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型模式 1.Composite 2·Iterator //
阅读全文
摘要:“数据结构”模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型模式 1.Composite 2·Iterator 3·
阅读全文
摘要:“状态变化”模式 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化"模式为这一问题提供了一种解决方案。 典型模式 State Memento 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,
阅读全文
摘要:“状态变化”模式 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化"模式为这一问题提供了一种解决方案。 典型模式 State Memento 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变
阅读全文
摘要:“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式 Facade Proxy Adapter Mediator 动机(Motivation) 在软件构建过程中,经常
阅读全文
摘要:“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式 Facade Proxy Adapter Mediator 动机(Motivation) 在软件系统中,由于应用
阅读全文
摘要:“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式 Facade Proxy Adapter Mediator 动机(Motivation) 在面向对象系统中,有些
阅读全文
摘要:“接口隔离”模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式 Facade Proxy Adapter Mediator 系统间的耦合复杂度 动机(Motivation) 上
阅读全文
摘要:“对象性能”模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模式 Singleton Flyweight 动机(Motivation) 在软件系统采用纯粹对象方案的问题在
阅读全文
摘要:“对象性能”模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模式 Singleton Flyweight 动机(Motivation) 在软件系统中,经常有这样一些特殊的
阅读全文
摘要:“对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory Method Abstract Factory Prototype Builder 这个模式用的比较少。比
阅读全文
摘要:“对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory Method Abstract Factory Prototype Builder 原形模式 这个模式现在
阅读全文
摘要:“对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory Method Abstract Factory Prototype Builder 动机(Motivati
阅读全文
摘要:“对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory Method Abstract Factory Prototype Builder 动机(Motivati
阅读全文
摘要:“单一职责”模式: 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式 Decorator Bridge 动机(Motivation) 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多
阅读全文
摘要:引用的对象不存在 #include <iostream> using namespace std; class A { public: A(int x) { this->x = x; } ~A() {}; int get_x() { return x; } private: int x; }; A&
阅读全文
摘要:C++中,有3个常用的API包装器模式:代理模式,适配器模式,外观模式。它们都属于结构型模式,按包装器层和原始接口的差异递增。 示例: /*代理模式*/ #include <iostream> using namespace std; class Subject //Subject 定义了RealS
阅读全文
摘要:装饰模式,类图: 部件 (Component) 声明封装器和被封装对象的公用接口。 具体部件 (Concrete Component) 类是被封装对象所属的类。 它定义了基础行为, 但装饰类可以改变这些行为。 基础装饰 (Base Decorator) 类拥有一个指向被封装对象的引用成员变量。 该变
阅读全文
摘要:“单一职责”模式: 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式 Decorator Bridge 动机(Motivation) 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继
阅读全文
摘要:“组件协作”模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式 Template Method Observer / Event Strategy 动机(Motivation) 在
阅读全文
摘要:“组件协作”模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式 Template Method Observer / Event Strategy 模板方法模式 Template
阅读全文
摘要:GOF-23 模式分类 从目的来看: 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。 结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。 行为型(B
阅读全文
摘要:理解松耦合的设计思想。 理解设计原则比掌握某一个具体的设计模式更重要。 设计模式伴随的方法 —— 重构。 面向对象的设计模式 —— GOF 23 种为主干。 为什么要设计模式?解决不断重复的问题。可复用是面向对象的目标。94年《设计模式:可复用面向对象软件的基础》。 **底层思维:**向下,从机器底
阅读全文
摘要:“组件协作”模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式 Template Method Observer / Event Strategy 动机(Motivation) 在
阅读全文
摘要:变化是复用的天敌!(使用了抽象设计的)面向对象设计最大的优势在于:抵御变化! 理解隔离变化 从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。也不是说完全没有影响,将影响减为最小。 各司其职 从微观层面来看,面向对象的方式更强调各个类的“责任”。 // 之前的分解和
阅读全文
摘要:▲ 计算机系统课程 ▲ 重构和设计模式的推荐书籍
阅读全文
摘要:生成器是一种创建型设计模式, 当构建一个复杂对象时,将构建过程与表示分离。使得同样的过程创建不同的对象。生成器与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。 生成器 (Builder) 接口声明在所有类型生成器中通用的产品构造步骤,一般都由虚函
阅读全文
摘要:组合模式的核心思想就是:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。对于分组织,只用通知分组织就可以了,而不用一一通知分组织的各个部门。 组件(Component):为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Re
阅读全文
摘要:Command(抽象命令类):抽象出命令对象,可以根据不同的命令类型。写出不同的实现类 Concrete Command(具体命令类):实现了抽象命令对象的具体实现 Invoker(调用者/请求者):请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令来
阅读全文
摘要:BaseHandler:抽象基类,用于作为处理请求的接口。如果特定等级的请求该类无法处理,则传递给下一个handler,一般这类情况class内部都是纯虚函数。 ConcreteHandler(TechnicalSupportHandler, BillingSupportHandler, and G
阅读全文
摘要:抽象中介者(Mediator):抽象中介者角色定义统一的接口,用于各同事角色之间的通信。 抽象同事类(Colleague ):每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分两种:一种是同事本身行为,比如改变对象本身的状态,处理自己的行为等
阅读全文
摘要:上下文(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。 抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。 具体状态(Concrete State):实现抽象状态所对应的行为,并且在需要的情况
阅读全文
摘要:这种模式比较常见,发布和订阅的机制。 普通触发 示例: /*观察者模式*/ #include <iostream> #include <set> using namespace std; //观察者接口,包括事件响应函数 class Observer { public: virtual void u
阅读全文
摘要:Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。该角色把其他类转换为我们期望的接口 Adapter(适配器类):将被适配者和目标接口组合到一起的类,适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的
阅读全文
摘要:上帝对象: 外观模式为现有对象定义了一个新接口, 适配器模式则会试图运用已有的接口。 适配器通常只封装一个对象, 外观通常会作用于整个对象子系统上。 示例: #include<iostream> using namespace std; class Sub_Work1//子工作1 { public:
阅读全文
摘要:策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 示例: #include <iostream> //飞行行为,用抽象类表示 strategy 抽象策略类 class FlyBehavior { public: virtu
阅读全文
摘要:Environment.NewLine
阅读全文
摘要:引用 dll 在 Halcon 安装目录下的 bin\dotnet35 引用 halcondotnet.dll。 包含命名空间: xmlns:halcon="clr-namespace:HalconDotNet;assembly=halcondotnet" 测试代码: 界面: <Grid> <Gri
阅读全文
摘要:如果要看底层实现才能理解发生的事情那算不上抽象 -- P.J Plauger 避免语法错误的同时,还需要注意语义,因为大多数错误比语法错误更难于诊断和更正。 语义上的封装性和语法上的封装性二者的难度相差无几。从语法角度来说,要想避免窥探另一个类的内部实现细节,只要把它的内部的子程序和数据都声明为 p
阅读全文