随笔分类 - .Net / C#版GOF23种设计模式学习
摘要:1、观察者模式 关于观察者模式,不在赘述,本质是利用event和handler配合,event本质是handler的实例,通过在event挂载事件实现内存级别的程序的通知机制.下面通过代码来展示常用观察者模式的构建方式. (1)、需求 假设X工厂有一台锅炉,现在需要一个监测程序,该程序监测锅炉的温度
阅读全文
摘要:1、简介 泛型工厂理论上不算Gof23中设计模式之一,但是也算是一种非常好的设计模式,个人认为,废话不多说,先写个简单的抽象工厂,在写一个泛型工厂的例子来比较抽象和泛型的区别. 2、实战 还是房屋和道路,always road and house,例子不重要重要的是对模式的理解. 3、抽象工厂 ok
阅读全文
摘要:1、简介 在日常开发中,某些对象的状态如果发生改变,对应的行为也将发生改变,那么如何在运行时根据对象的状态动态的改变对象的行为,同时不产生紧耦合关系(即使用if else或者swith所带来的紧耦合关系).即对扩展开放,对修改关闭一开闭原则. 2、案例 假设用户提出了一个需求,有三类文档对象,他们都
阅读全文
摘要:一、简介 耦合是软件不能抵御变变化的根本性原因,不仅实体对象与实体对象之间有耦合关系(如创建性设计模式存在的原因),对象和行为之间也存在耦合关系. 二、实战 1、常规开发中,我们经常会在控制器中或者Main方法中调用多个对象,进行批量的操作(完成一次事务性的操作),像下面这样: /// <summa
阅读全文
摘要:1、问题 在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失接口透明性的情况下,解决这些麻烦? 2、解决方案 通过架设一层中间层,让这层中间层来解决上面的麻烦,也就是我们所说的代理。大致的结
阅读全文
摘要:1、面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能。但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如下: 调用代码如下: 在客户端系统生成了一千万个对象实例,最后产生了369M的内存开销,还单单是一个
阅读全文
摘要:1、系统的复杂度 需求:开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮等各子系统构成.然后由对应的子系统调用. 常规的设计如下: ok,这是最简单的实现,完成了游戏系统对坦克系统的调用,将上面的系统调用抽象成一张构成图,如下: 可以发现,坦克系统的各个组成
阅读全文
摘要:1、需求 假设让我们去设计FCL中的Stream类,该类具有流类的基本功能,除了有各种不同类型的流外(如内存流、文件流、网络流等等),但是在不同的业务场景下,如处理银行业务,需要给相关的内存流进行加密操作,给相关的银行视频业务,进行视频流加密操作. 2、通常性的做法 ok,上面的设计符合我们的需求,
阅读全文
摘要:1、概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2、案例 需要构建一个容器系统,需要满足以下几点要求: (1)、容器需要能创建和删除子容器 (2)、但是整个系统有最终的容器结构一一取名SingleBox (3)、容器有自有业务逻辑,
阅读全文
摘要:现有一个需求,一个游戏系统需要构建不同风格的房屋,暂不考虑其他设计模式,需要能实现在PC端、移动端....等等多个平台的构建.最简单的实现方式如下: ok,这种设计虽然能很好的满足需求,但是这里只列举了两种平台,如果之后需要支持更多的平台,这种设计模式显然不行,因为产生的类会原来越多.随之维护的成本
阅读全文
摘要:1、概要 适配:即在不改变原有实现的基础上,将原先不适合的接口转换成适合的接口. what is Apater?适配,这个概念在生活中无处不在,比如你的iphone 4手机充电器坏了,这是时候只有一个iphone 8的充电器,两个充电器的头并不匹配,这个时候,你就需要一个充电器适配器.这个适配器将8
阅读全文
摘要:具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1、在FactoryMethod工厂方法模式(创建型模式)的基础上,提出了一个代码上的需求,需要对前面的风格进行抽象,将相同风
阅读全文
摘要:1、工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一个Build的创建方法,而Build内部的方法实现,该实现依赖与各种具体的实现,而这些实现变化的
阅读全文
摘要:1、原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一个Build的创建方法,而Build内部的方法实现,该实现依赖与各种具体的实现,而这些实现变化的非常
阅读全文
摘要:一、控制反转和依赖注入两者搭配能像反射工厂那样解决程序集之间的耦合问题,下面将从Asp.Net经典的三层模式多方位的讲解控制反转和依赖注入模式,是如何帮我们进行程序集之间的解耦的。 上图是最基本的三层框架,具体的流程如下: 1、表现层调用业务层的方法 2、业务层调用数据层的方法,并对数据层返回的基础
阅读全文
摘要:Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer,它观察着Subject,当Subject中的某件事发生后,会告知Observer,Obersver
阅读全文
摘要:一、使用场景: 1、假设要创建一个House设施,该设施的创建由若干个部分组成,而且这若干个部分经常变化。 如果用最直观的设计方式,每一个房屋部分的变化,都将导致整个房屋结构的重新修正,但是这种设计方式,维护成本太高,而且如果对象极度复杂,那么很容易就会产生问题! So,Builder Patter
阅读全文
摘要:1、new 的问题 常见的对象创建方法: new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我们创建的对象实例依赖于Road对象的内部实现,如果Road对象不会发生变化(或者发生变化的频率很小),那么单纯的用new是可以的,但是上面的Road我们单纯籽籽棉意思上理
阅读全文
摘要:一、使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性、以及良好的效率。 大多数类用的是常规的构造器,所以往往能创建很多实例,那么如何绕过常规的构造器,并且提供一种机制(设计模式)来保证一个类只有一个实例。 二
阅读全文