首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用模式构建:多态模式(The Polymorphic Pattern

Polymorphic Design Pattern with Common Fields 对于职业运动员的记录既有相似之处也有不同之处。使用多态模式,我们可以很容易地适应这些差异。...相反,由于我们使用了多态模式,我们所有的数据都存储在一个运动员集合中,通过一个简单的语句就可以完成对所有运动员的查询。 这种设计模式也可以使用在嵌入式子文档中。...在上面的例子中,Martina Navratilova不仅仅是作为一名单独的选手参加比赛,所以我们可能希望她的记录结构如下: Polymorphic Design Pattern with sub-documents...我们的运动员示例可以很容易地扩展到一个更完善的内容管理系统中,并在其中使用多态模式。 结 论 当文档具有更多的相似性而不是差异性时,就会使用多态模式。...我们将讨论的下一个模式是属性模式(Attribute Pattern)。 如果你有任何问题,欢迎留言。 end / 译者简介 / 牟天垒: 野生程序员一枚。长期关注分布式系统及通用型数据库技术。

1.1K20

使用模式构建:多态模式(The Polymorphic Pattern

Polymorphic Design Pattern with Common Fields 对于职业运动员的记录既有相似之处也有不同之处。使用多态模式,我们可以很容易地适应这些差异。...相反,由于我们使用了多态模式,我们所有的数据都存储在一个运动员集合中,通过一个简单的语句就可以完成对所有运动员的查询。 这种设计模式也可以使用在嵌入式子文档中。...Polymorphic Design Pattern with sub-documents 从应用程序开发的角度来看,当使用多态模式时,我们将查看文档或子文档中的特定字段,以便能够跟踪差异。...我们的运动员示例可以很容易地扩展到一个更完善的内容管理系统中,并在其中使用多态模式。 结 论 当文档具有更多的相似性而不是差异性时,就会使用多态模式。...我们将讨论的下一个模式是属性模式(Attribute Pattern)。 如果你有任何问题,欢迎留言。 end ? /译者简介 / 牟天垒: 野生程序员一枚。长期关注分布式系统及通用型数据库技术。

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

面向对象的适配器 你有个老系统, 现在来了个新供应商的类, 但是它们的接口不同, 如何使用这个新供应商的类呢? 首先, 我们不想修改现有代码, 你也不能修改供应商的代码....这就需要使用外观模式(Facade Pattern).  外观模式会隐藏一个或多个类的复杂性, 并提供一个整洁干净的外观(供外界使用)....现在你想看一个电影, 步骤如下: 打开爆米花机 开始制作爆米花 把灯光调暗 把屏幕放下来 把投影仪打开 把投影仪的输入媒介设为DVD 把投影仪调整为宽屏模式 打开功放 把功放的输入媒介设为DVD 把功放设置为环绕立体声...这个需求, 就需要使用外观模式了. 使用外观模式, 你可以通过实现一个外观类把一个复杂的子系统简单化, 因为这个外观类会提供一个更合理的接口....适配器模式: 转化一个类的接口以便客户可以使用. 外观模式: 为一个子系统的一套接口提供一个统一的接口. 外观定义了一个让子系统更容易使用的高级接口.

94760

使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)

本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题....我们还需要维护一种可以在该结构下遍历所有菜单的方法, 要和使用遍历器一样简单....使用组合模式, 我们可以把相同的操作作用于组合或者单个对象上. 也就是说, 大多数情况下我们可以忽略对象们的组合与单个对象之间的差别. 该模式的类图: ?...客户Client, 使用Component来操作组合中的对象. Component定义了所有对象的接口, 包括组合节点与叶子....所以我们还是使用try catch吧. 测试: ? Ok. 总结 设计原则: 一个类只能有一个让它改变的原因.

1K00

使用 C# (.NET Core) 实现命令设计模式 (Command Pattern)

说到这就不得不提到命令模式(Command Pattern)了. 命令模式允许你把动作的请求者和动作的实际执行者解耦. 这里, 动作的请求者就是遥控器, 而执行动作的对象就是某个家用电器....项目设计图 回到我们的需求, 参考快餐店的例子, 使用命令模式做一下设计: 客户Client创建了一个命令(Command)对象....家用电器使用自己独有的控制方法进行动作....这里面: 客户 --- 饭店客人, 我 命令 --- 订单, 插槽 调用者 --- 服务员, 遥控器 setCommand()设置命令 --- takeOrder() 取订单, 插上需要控制的电器 execute...记录请求 这个例子就是使用命令模式记录请求动作的历史, 如果出问题了, 可以按照这个历史进行恢复.

1.2K80

使用C# (.NET Core) 实现命令设计模式 (Command Pattern)

说到这就不得不提到命令模式(Command Pattern)了. 命令模式允许你把动作的请求者和动作的实际执行者解耦. 这里, 动作的请求者就是遥控器, 而执行动作的对象就是某个家用电器....项目设计图 回到我们的需求, 参考快餐店的例子, 使用命令模式做一下设计: 客户Client创建了一个命令(Command)对象....家用电器使用自己独有的控制方法进行动作....这里面: 客户 --- 饭店客人, 我 命令 --- 订单, 插槽 调用者 --- 服务员, 遥控器 setCommand()设置命令 --- takeOrder() 取订单, 插上需要控制的电器 execute...记录请求 image.png 这个例子就是使用命令模式记录请求动作的历史, 如果出问题了, 可以按照这个历史进行恢复.

43520

使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)

实际中有很多种对象我们可能只需要它们的一个实例, 例如: 线程池,缓存, 弹出的对话框, 用于保存设置的类, 用于logging的类, 硬件设备驱动对象等等. 一段对话: A: 如何创建一个对象?...这是个鸡和蛋的问题: 我可以使用MyClass里面的构造函数, 但是我无法实例化这个对象, 因为其他的类无法使用 "new MyClass()"....请看下图: 处理多线程问题 为了解决这个多线程的问题问题, 可已使用synchronized方法: (synchronized是java里的关键字, C#的请参考下面我写的代码) 使用synchronized...如果性能不是那么重要, 就继续使用synchronized吧. 但是要记住使用synchronized之后运行速度可能会差100倍(JVM). 2. 那就不如早点把实例给创建出来, 而不是懒创建....例如: 使用静态的成员引用, 这样类在加载的时候就把实例创建出来了(保证在任何线程访问之前就会创建出来). 3. 使用"双重检查锁"来减少对sync的使用.

93240

使用C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

使用模板方法时: 咖啡和茶各自控制自己的算法. 饮料间的代码重复. 改变算法需要修改多个地方 添加新饮料需要做很多工作....DIP告诉我们不要使用具体的类, 尽量使用抽象类. 而好莱坞原则则是让低级别组件可以被钩进算法中去, 也没有建立低级别组件和高级别组件间的依赖关系....三种模式比较: 模板方法模式: 子类决定如何实现算法中特定的步骤 策略模式: 封装变化的行为并使用委托来决定哪个行为被使用. 工厂方法模式: 子类决定实例化哪个具体的类....使用模板方法做排序 看看java里面数组的排序方法: mergeSort就可以看做事模板方法, compareTo()就是需要具体实现的方法....但是这个并没有使用子类, 但是根据实际情况, 还是可以灵活使用的, 你需要做的就是实现Comparable接口即可., 这个接口里面只有一个CompareTo()方法.

57720

使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

使用模板方法时: 咖啡和茶各自控制自己的算法. 饮料间的代码重复. 改变算法需要修改多个地方 添加新饮料需要做很多工作....DIP告诉我们不要使用具体的类, 尽量使用抽象类. 而好莱坞原则则是让低级别组件可以被钩进算法中去, 也没有建立低级别组件和高级别组件间的依赖关系....三种模式比较: 模板方法模式: 子类决定如何实现算法中特定的步骤 策略模式: 封装变化的行为并使用委托来决定哪个行为被使用. 工厂方法模式: 子类决定实例化哪个具体的类....使用模板方法做排序 看看java里面数组的排序方法: mergeSort就可以看做事模板方法, compareTo()就是需要具体实现的方法....但是这个并没有使用子类, 但是根据实际情况, 还是可以灵活使用的, 你需要做的就是实现Comparable接口即可., 这个接口里面只有一个CompareTo()方法.

95740

使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)

例如: 如果一个服务员需要使用两份菜单的话, 那么她就无法很快的告诉客户有哪些菜是适合素食主义者的了....想要遍历早餐项, 我们使用ArrayList的size()和get()方法: 2. 想要遍历午餐项, 我们需要使用Array的length成员变量以及通过索引访问数组: 3....而服务员使用的是迭代器接口. 现在呢, 菜单还没有共同的接口, 这意味着服务员仍然被绑定在两个具体的菜单类上, 一会我们再说这个....使用java内置的Iterator来实现 由于PancakeHouseMenu使用的是ArrayList, 而ArrayList已经实现了该接口, 那么:这样简单改一下就可以: 针对DinerMe菜单...需求变更 还需要添加另一份菜单: 这个菜单使用的是HashTable.

54330

使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)

上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂....也就是说各地的披萨是使用相同的原料, 但是每种原料在各地可能会存在差异(不同的实现). 这就是纽约, 芝加哥和加州各自的原料家族....现在各地披萨店的原料都是从工厂送来的, 就不能使用劣质原料代替了....之前使用工厂方法模式时, 我们为每个地点创建了不同风格的披萨, 例如 NYCheesePizza, ChicagoCheesePizza....抽象工厂也经常使用工厂方法来实现具体的工厂. 而工厂方法也经常使用抽象的创造者, 它来使用子类创造出的具体产品.

43120

常用开源框架中设计模式使用分析-命令模式(Command Pattern

十四、命令模式(Command Pattern) 14.1 介绍 命令模式是一种行为模式,通过把命令封装为一个对象,命令发送者把命令对象发出后,就不去管是谁来接受处理这个命令,命令接受者接受到命令对象后进行处理...image.png tomcat中Connector作为命令发出者,Connector接受到请求后把请求内容封装为request对象(命令对象),然后使用CoyoteAdapter作为分发器把请求具体发配到具体的...另外对于使用springmvc的应用来说,上面找到具体应用,但是具体交给那个controller来处理那,这是不是也是命令模式的使用那。...14.3 使用场景 当事件发送者和接受者直接需要完全解耦(直接并不存在引用关系)时候。

2.1K10

使用C# (.NET Core) 实现状态设计模式 (State Pattern)

创建一个类作为状态机, 针对每一个动作, 我们创建一个方法, 在方法里我们使用条件语句来决定在每个状态中该行为是否合理....回想一下设计原则: "把变化的部分封装起来" 和 "尽量使用组合". 我们可以把每个状态的行为放到它自己的类里面, 然后每个动作只需要实现自己状态下的动作即可....而且也许糖果机可以使用状态对象来委托表示自己当前的状态. 重新设计 这次我们就把状态的行为封装到各个状态对象里面, 并在动作发生的时候委托到当前的状态. 1....上面要实现的就是状态模式 (State Pattern). 把一个状态所有的行为放到一个类里面, 这样, 就实现了本地化并且便于修改和理解. 设计类图: 这里我们使用状态类来代替初版设计中的数值....使用继承来定义类的行为, 当你需要改变的时候, 这个行为还会在的, 使用策略模式可是组合不同的对象来改变行为.

2.2K50

常用开源框架中设计模式使用分析- 门面模式(Facade Pattern

七、 门面模式(Facade Pattern) 7.1 介绍 门面模式是一种结构性模式,它通过新增一个门面类对外暴露系统提供的一部分功能,或者屏蔽了内部系统的复杂性,对外部仅仅暴露一个简单的接口,或者通过调用不同的服务对外提供统一的接口...,让使用者对这些内部服务透明化。...7.2 模板引擎Velocity中门面模式使用 Velocity里面的VelocityEngine和Velocity类都是RuntimeInstance类的门面,后者提供了模板渲染的所有功能,前两者则是内部维护...7.3 使用场景 当需要对外屏蔽一个系统的复杂性时候可以考虑使用门面模式对外提供简单可读性高的接口类 当需要对外部暴露系统一部分权限的接口时候可以考虑使用门面模式减少系统权限。...当系统需要调用不同服务汇总后在对外提供服务时候可以考虑使用门面模式对外屏蔽细节,之暴露一个接口。

71210
领券