随笔分类 - 架构师-软件设计原则和设计模式
摘要:一、缘起 算法与对象的耦合:对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱。 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂。 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?
阅读全文
摘要:一、缘起 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合--比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不适合的。 在这种情况下,如何将“行为请求者”与“行为实现者”解耦? 将一组行为抽象为对象,可以实现两
阅读全文
摘要:一、缘起 变化--是软件设计的永恒主题,如何管理变化带来的复杂性? 设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化点和稳定点,并使用特定的设计方法来应对这种变化。 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与
阅读全文
摘要:一、动机 在软件系统中,由于需求的变化,一个对象的功能实现经常面临着扩展变化,但是功能接口方法比较稳定。如何使“对象功能实现的扩展变化”能够根据需要来动态地实现? 我们来看下怎样使用装饰器模式来应对功能的扩展变化。 二、需求变化过程 1、软件需求 考虑一个实际应用:实现灵活的奖金计算。 奖金计算的特
阅读全文
摘要:一、动机 由于一个对象类型的固有逻辑,使得这个对象类型具有了两个(或多个)变化的维度。一个变化的维度为“。。。的变化”,一个变化的维度为“。。。的变化”。如何应对这种“多维度的变化”?如何利用面向对象技术来使得这个对象类型可以轻松地沿着“。。。”和“。。。”两个方向变化,而不引入额外的复杂度? 二、
阅读全文
摘要:零、使用动机 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成。 由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持
阅读全文
摘要:缘起 在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象的具体实现(类)经常面临着剧烈的变化,但是它却拥有比较稳定的接口。 如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求变化而变化? 我们可以使用工厂方
阅读全文
摘要:我们在设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 : 1>单例模式(Singleton); 2>静态方法. 但是, 对于这两种实现方式 , 那种更好呢? 在国内论坛上看了一下其他的一些看法 : http://hi.baidu.com/jiangzhong8
阅读全文
摘要:李建忠老师有一个设计模式的课程,其中在讲到模板方法模式曾说:如果你只想学习一种设计模式就学习模板方法吧。由此可见它使用的广泛性。 今天咱们就来一起学习模板方法模式。 那什么是模板方法模式呢? 在回答这个问题前,咱们先来看看模板。提到模板,相信大家马上能够想到一些东西,如ppt的模板,报表导出的exc
阅读全文
摘要:1.定义 软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。 2.分析 为什么要优先使用组合? 通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。 1)继承复用破坏了类的封装性。 因为继承会将父类的实现细节暴露给子类,父类
阅读全文
摘要:1.定义 最小知识原则。每个模块只应该了解那些与它关系密切的模块的有限知识。或者说,每个模块只和自己的朋友“说话”,不和陌生人“说话”。 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。 2.分析 高内聚是指相近的功能应该放到同一个类中,不相近的功能不要放到同一个类
阅读全文
摘要:1.定义 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 代码要依赖于抽象的类,而不要依赖于具体的类。要针对接口或抽象类编程,不要针对具体实现类编程。 2.分析 为什么使用依赖倒置原则? 1)增加松耦合 抽象接口不改变,具体类实现接口,具体类容易扔掉,更换
阅读全文
摘要:1.定义 客户端不应该依赖它不需要的接口,类间的依赖关系应该建立在最小的接口上。 2.分析 接口隔离原则是对接口的使用进行约束规范的一个原则,它告诉我们要想把接口用好,关键在于隔离。接口隔离原则告诉我们,不要把一大堆方法塞进一个接口里,导致这个接口变得臃肿无比。应该要根据实际需要,让接口中只有用得上
阅读全文
摘要:1.定义 所有引用基类(父类)的地方必须能透明地使用其子类的对象。 里式替换是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。 2.分析 为什么要遵循LSP? 违背LSP将导致没有定义的行为,没有定义的行为意味着它也许在开发阶段工
阅读全文
摘要:1.定义 设计良好的类或者模块应该对扩展开发,对修改关闭。 添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。 2.分析 为什么要使用开闭原则? 使用开闭原则能够限制对现有代码的修改,这会降低引入新的BUG的风险,其实我们在对原有代码
阅读全文
摘要:1.定义 任何一个类或者模块都应该只对某一个或一类行为者负责。 也就是说不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类包含了两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。 2.分析 为什么要遵循单一职责原则? 1)
阅读全文

浙公网安备 33010602011771号