代码改变世界

随笔分类 -  Design Pattern & SA

依赖倒转元祖和依赖注入详解

2013-05-13 20:24 by youxin, 392 阅读, 收藏, 编辑
摘要: 依赖倒转原则:代码要依赖于抽象的类,而不要依赖于具体的类;要正对接口或抽象类编程,而不是针对具体类编程。也就是说,在程序代表中传递参数书或在组合聚合关系中,尽量引用层次高的抽象类层,即使用接口和抽象类进行变量类型声明。参数类型声明。方法返回类型声明,以及数据类型的转换等,而不是用具体的类来做这些事情。为了确保该原则的应用,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用在子类中增加的新方法。实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。有了抽象层,可以使得系统具有. 阅读全文

UML关联和依赖区别

2013-05-11 16:10 by youxin, 2890 阅读, 收藏, 编辑
摘要: UML中UML依赖和UML关联关系的异同1.关联:连接模型元素及链接实例,用一条实线来表示;2.依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;3.聚集:表示整体与部分的关系,用一条实线加空心菱形来表示;4.组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;(关联,依赖,聚集,组成的异同见后描述)5.泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示;6.实现:表示类与接口的关系,用一条虚线加空心箭头来表示;UML依赖和UML关联的异同:(《Java面向对象编程》一书,作者:孙卫琴来源:www.javathinker.org)在建立对象模型时,很容易 阅读全文

策略模式与桥接模式区别

2013-05-10 21:27 by youxin, 2033 阅读, 收藏, 编辑
摘要: 桥接模式如下:策略如下:在桥接中,Abstraction通过聚合方式引用Implementor.在策略中,Context也通过聚合引用Strategy.桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式。从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且该抽象接口的实现可以有多种并且可以替换。可以说两者在表象上都是调用者与被调用者之间的解耦,以及抽象接口与实现的分离。那么两者的区别体现在什么地方呢?1. 首先,在形式上,两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅Implemento 阅读全文

设计模式之桥接模式

2013-05-10 20:56 by youxin, 317 阅读, 收藏, 编辑
摘要: 在软件系统中,有些类由于其本身的固有特性,使得它具有两个或多个变化维度,这种变化维度又称为变化原因。对于这种多维度变化的系统,桥接模式提供了一套完整的解决方案,并且降低了系统的复杂性。模式动机:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下2种解决办法:1.为每种形状都提供一套各种颜色的版本,如下:4种形状,3种颜色,我们需要4*3=12个类,简直就是class boom。而且每增加一个形状,我们都要增加3个颜色类。增加一种颜色,其他形状都要增加。2.第二种方案是设计4个形状类,3个颜色类,根据需要对. 阅读全文

工厂模式与抽象工厂模式

2013-05-10 20:06 by youxin, 606 阅读, 收藏, 编辑
摘要: 在工厂方法中,工厂父类负责定义创建产品对象的公共接口,而工厂子类生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.uml:注意到Product和Factory是平行的类层级。下面看一个生产电视机的实. 阅读全文

设计模式之装饰者模式2

2013-05-10 15:28 by youxin, 244 阅读, 收藏, 编辑
摘要: 在oo中,一般有2中方式可以实现给一个类或对象增加行为:1.继承机制使用继承机制给现有类增加 功能,这种方法是静态的,用户 不能控制增加行为的方式和时机2.关联机制关联机制是一种更加灵活的方法,即将一个类的对象嵌入到另一个对象中,由另一个对象来决定是否调用嵌入对象的行为并扩展自己的行为,我们称这个对象为装饰器(decorator)。为了使得装饰器与他所装饰的对象对客户端来说透明,装饰器类和被装饰的类必须实现相同的接口,客户端使用时无需关心一个类的对象是否被装饰过,可以一致性第使用未被装饰的对象以及装饰好的对象。装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得 阅读全文

设计模式之解释器模式

2013-03-13 18:32 by youxin, 266 阅读, 收藏, 编辑
摘要: 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案,在现在项目中使用较少(谁没事干会去写一个PHP或者Ruby的解析器),其定义如下:Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language。给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 解释器模式的通用类图如图27-. 阅读全文

设计模式之组合模式

2013-03-08 17:23 by youxin, 259 阅读, 收藏, 编辑
摘要: Composite:definitionCompose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。 涉及角色: 1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Com.. 阅读全文

设计模式之prototype原型模式

2013-03-08 16:31 by youxin, 254 阅读, 收藏, 编辑
摘要: definitionSpecify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype.participantsThe classes and/or objects participating in this pattern are:Prototype(ColorPrototype)declares an interface for cloning itselfConcretePrototype(Color)implements 阅读全文

oo之六大设计原则&&Solid原则

2012-11-26 20:14 by youxin, 470 阅读, 收藏, 编辑
摘要: file:///D:/%E6%88%91%E7%9A%84%E8%B5%84%E6%96%99%E5%BA%93/Downloads/ISP2.gif 阅读全文

转:OOD设计原则之里氏替换原则

2012-11-26 19:26 by youxin, 324 阅读, 收藏, 编辑
摘要: 里氏替换原则(Liskov Substitutiion Principle,LSP)被称作继承复用的基石,它的提出甚至要早于OCP。不过遗憾的是,由于对这一原则的理解各不相同,经过多次的翻译、转述,LSP成了OOD设计原则中争议最多的话题之一。其实早在1987年的OOPSLA大会上,麻省理工学院(MIT)计算机科学实验室的Liskov女士就发表了经典文章Data Abstraction and Hierarchy,其中提出了以她名字命名的Liskov替换原则(The Liskov Substitution Principle),简称LSP。该原则说明了什么时候该使用继承,什么时候不该使用以及为 阅读全文

设计模式之单例模式

2012-11-26 13:12 by youxin, 298 阅读, 收藏, 编辑
摘要: 剖析经典的单例模式实现。// NOTE: This is not thread safe!public class Singleton { private static Singleton uniqueInstance; // other useful instance variabl... 阅读全文

转:设计模式六大原则(1):单一职责原则

2012-11-26 12:40 by youxin, 203 阅读, 收藏, 编辑
摘要: 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。 说到单一职责原则,很多人都会不屑一顾。因为它太简单了。稍有经验的程序员即使从来没有读过设计模式、从来没有听说过单一职责原则,在设计软件时也会自觉的遵守这一重要原则,因为这是常识。 阅读全文

个人MVC程序及心得

2012-11-22 19:52 by youxin, 350 阅读, 收藏, 编辑
摘要: 用MVC写了一个简单的图片浏览程序。程序界面如下:整个程序的编写采用了MVC的架构,总算对MVC有了一定的认识。首先编写Model。ModelInterface如下;public interface ModelInterface { void registerObserver(NextObserver o); void removeObserver(NextObserver o); //oid init(); String getImageStr(); int getImageIndex(); void setImageStr(int i);... 阅读全文

设计模式之MVC模式

2012-11-15 15:30 by youxin, 582 阅读, 收藏, 编辑
摘要: MVC是一个复合模式,下面看一个程序来完整实现MVC。利用MVC控制节拍。首先创建模型接口。模型负责维护所有的数据,状态和应用逻辑。 前面的4个方法是让控制器调用的,控制器根据用户的操作而对模型做出适当的处理。观察者分为2中:一种希望每个节拍都被通知。另一种希望BPM(BEATS per minute)改变时才通知。现在,让我们看看具体的BeatModel类:具体代码:View Code 1 import javax.sound.midi.*; 2 import java.util.*; 3 4 public class BeatModel implements BeatModel... 阅读全文

项目中的需求蔓延

2012-10-06 19:17 by youxin, 559 阅读, 收藏, 编辑
摘要: 产品经理你伤不起:Dropbox提供储存功能,然后用户要求提供删除功能。提供之后,用户要求提供误删除恢复功能。提供之后,用户要求提供永久删除无法恢复功能。提供之后,用户要求提供永久删除紧急恢复功能。提供之后,dropbox创始人自杀,遗书上写着:I AM A SB。这段话对“项目蔓延"做了很好的阐述。 阅读全文

设计模式之反(向)模式

2012-10-06 18:39 by youxin, 1212 阅读, 收藏, 编辑
摘要: 在软件工程中,一个反面模式(anti-pattern或antipattern)指的是在实践中明显出现但又低效或是有待优化的设计模式[1][2],是用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产的系统时辨认出来。Andrew Koenig在1995年造了anti-pattern这个词[3],灵感来自于GoF的《设计模式》一书。而这本书则在软件领域引入了“设计模式”(design pattern)的概念[4]。三年后antipattern因《AntiPatterns》这本书而获得普及,而它的使用也从软件设计领域扩展到了日常的社会互动中。按《Ant 阅读全文

设计模式之迭代器与组合模式

2012-10-06 15:24 by youxin, 253 阅读, 收藏, 编辑
摘要: 有许多中方法可以把对象堆起来成为一个集合(Collection)。你可以把他们放进数组,堆栈,列表或散列表(Hashtable)中,这是你的自由。每一种都有他自己的优点和合适的使用时机,但总有一个时候,你的客户想要遍历这些对象,而当他这么做时,你打算让客户看到你的实现吗?我们当然希望最好不要!这太不专业了。没关系,不要为你等工作担心,你将在这章学习如何能让客户遍历你的对象而又无法窥视你存储对象的方式,也将学习如何创建一些对象超集合(supercollection)。爆炸性新闻:对象村餐厅和对象村煎饼屋合并了。真是个好消息,现在我们可以再同一个地方,想用煎饼屋美味的煎饼早餐,和好吃的餐厅午餐,但 阅读全文

设计模式之模板方法模式

2012-10-06 02:23 by youxin, 319 阅读, 收藏, 编辑
摘要: 模板方法模式,我们将要深入封装算法块,好让子类可以在任何时候都可以将自己挂接进运算里。茶和咖啡的冲泡方式非常相似,不信你瞧瞧:快速搞定几个咖啡和茶的类。public class Coffee { void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk(); } public void boilWater() { System.out.println("Boiling water"); ... 阅读全文

设计模式之适配器模式和外观模式adapter and facade

2012-10-04 16:20 by youxin, 433 阅读, 收藏, 编辑
摘要: 我们周围的适配器 交流的适配器。。。这是真实世界的适配器,那面向对象的适配器又是什么?其实,oo适配器和真实世界的adapter扮演着同样的角色:将一个接口转换成另一个接口,以符合客户的期望。 面向对象适配器 假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商设计出来的接口,不同于旧厂商的接口。你不想改变现有的代码,解决这个问题(而且你也不能改变厂商的代码),所以该怎么办?可以写一个类,将新厂商的接口转换成你所期望的接口。这个适配器工作起来就如同一个中间人,它将客户所发出的请求转换成厂商类能理解的请求。还记得第1章中的鸭子吗?让我们看看鸭子接口和类的一个稍微简化的版本: 阅读全文