
Design Pattern
文章平均质量分 81
henry860916
水滴石穿
展开
-
策略模式
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。策略模式:定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。从概念上讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。如上例,现在想要增加一种原创 2017-05-13 09:03:42 · 227 阅读 · 0 评论 -
设计模式的七大原则
面向对象三大特性:封装,继承,多态对象的优点:可维护,可扩展,可复用,灵活性好 1. 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。例如界面和逻辑就需要分开,坚决不能在一个类中实现。否则界面的改动导致这个类发生变化,从而导致逻辑功能可能遭到破坏。其实,软件设计真正要做的许多内容,就是发现职原创 2017-05-06 21:23:46 · 407 阅读 · 0 评论 -
访问者模式
访问者模式:表示一个作用于某对象结构中的个元素的操作。它使得你可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。例如:男人,女人,操作/访问者为 失败,成功如果人类性别不止男女,还有中性,那么访问者模式将不适合,因为增加一个性别,将会设计好多类的改动,不符开放-封闭原则。访问者模式适合数据结构相对稳定的系统。它把数据结构和作用于数据结构上的操作之间耦合解开,使得操作集合可原创 2017-05-13 18:15:57 · 271 阅读 · 0 评论 -
享元模式
享元模式:运用共享技术有效地支持大量细粒度的对象。内部状态:在享元对象内部并且不会随环境改变而改变的共享部分。外部状态:随环境改变而改变的,不可以共享的如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以使用相对少的共享对象取代很多组的对象,此时可以考虑使用。享元对象本身也原创 2017-05-13 11:13:10 · 284 阅读 · 0 评论 -
中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使得其耦合松散,而且可以独立地改变它们之间地交互。网状结构变成以中介者为中心地星型结构。中介者地出现减少了各个colleague的耦合,使得可以独立地改变和复用各个colleague类的mediator。由于mediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得原创 2017-05-13 11:03:45 · 300 阅读 · 0 评论 -
职责链模式
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,指导有一个对象处理为止。当客户提交一个请求时,请求沿着链传递直至有一个ConcreteHandler对象负责处理它。 class Program { static void Main(string[] args)原创 2017-05-13 10:56:50 · 274 阅读 · 0 评论 -
命令模式
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤消的操作。 class Program { static void Main(string[] args) { Receiver r = new Receiver(); Com原创 2017-05-13 10:51:50 · 244 阅读 · 0 评论 -
桥接模式
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立变化。基于:合成/聚合复用原则。例如手机品牌与手机软件。即,实现系统可能有多角度分类,每一种分类都有可能变化,那么久把这种多角度分离出来,让他们独立变化,减少耦合。只要真正深入理解设计原则,很多设计模式其实就是原则的应用而已,或者不知不觉就在使用设计模式了。 class Program {原创 2017-05-13 10:46:02 · 232 阅读 · 0 评论 -
单例模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。多线程时,注意lock,双重锁定:double-check locking应延迟需求。 class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInst原创 2017-05-13 10:36:06 · 203 阅读 · 0 评论 -
迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象内部表示。目前需要高级语言已经自带这种实现了,因此martinflower提出撤消此模式。类似foreach in class Program { static void Main(string[] args) { Concrete原创 2017-05-13 10:28:33 · 191 阅读 · 0 评论 -
组合模式
组合模式:将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的适用具有一致性。当需求中是体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,应该考虑使用组合模式。组合模式让客户可以一致地使用组合结构和单个对象。 class Program { stat原创 2017-05-13 10:24:21 · 198 阅读 · 0 评论 -
状态模式
MartinFlower曾在《重构》中写到:一个很重要的代码坏味道叫做Long method,代码过长说明责任过大,很糟糕。面向对象设计其实就是希望做到代码的责任分解。状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。原创 2017-05-13 10:01:28 · 235 阅读 · 0 评论 -
观察者模式
观察者模式:又叫发布-订阅模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。当一个对象的改变需要同时改变其他对象的时候使用。主要是解耦的过程,让耦合的双发都依赖与抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。 class Program {原创 2017-05-13 09:52:01 · 213 阅读 · 0 评论 -
建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。当创建复杂对象的算法应该独立与该对象的组成部分以及它们的装配方式时适用的模式。 class Program { static void Main(string[] args) { Director director = new原创 2017-05-13 09:41:03 · 213 阅读 · 0 评论 -
外观模式
外观模式:为子系统中的一组接口提供一个一致的界面。此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。 class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.Met原创 2017-05-13 09:33:55 · 198 阅读 · 0 评论 -
装饰模式 模板方法模式
装饰模式:动态给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。当系统需要新功能的时候,向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样就把类的核心职责和装饰功能区分开了,而且可以去除相关类的重复装饰逻辑。 class Program {原创 2017-05-13 09:12:56 · 672 阅读 · 0 评论 -
代理模式 原型模式
代理模式:为其他对象提供一种代理,以控制对这个对象的访问。 class Program { static void Main(string[] args) { Proxy proxy = new Proxy(); proxy.Request(); Console.R原创 2017-05-13 09:16:58 · 569 阅读 · 0 评论 -
简单工厂模式、工厂模式、抽象工厂模式
简单工厂:到底要实例化谁,将来是否会增加实例化的对象,这是很容易变化的地方,应该考虑使用一个单独的类来做这个创造实例的过程,就是工厂。 如果基于上述代码,需要增加一个求M的N次方的操作,那么需要改工厂方法,增加case,这就违背了开放-封闭原则。于是工厂方法来了。工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类原创 2017-05-07 21:27:27 · 304 阅读 · 0 评论