设计模式总结

来源:互联网 发布:民族性格知乎 编辑:程序博客网 时间:2024/04/30 12:23

1、简单工厂、工厂方法、抽象工厂之比较:http://blog.csdn.net/humanbeng/article/details/7176751

2、原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

提供一个克隆方法即可。

3、策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

将不同的算法封装一个个具体对象,客户根据需要调用不同算法即可,个人觉得有点类似简单工厂,只不过这里客户最终注重的是执行算法,而非new出对象。

4、几个原则:

1)面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。

2)单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责越多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。当变化发生时,设计会遭到意想不到的破坏。

3)开放-封闭原则:软件实体(类、模块、函数等)应该可以扩展,但是不可修改。也就是对于扩展时开放的,对于修改是封闭的。应该尽量用抽象来隔离变化。

4)依赖倒置原则:A.高层模块不应该依赖低层模块,两个都应该依赖抽象。B.抽象不应该依赖细节,细节应该依赖抽象。

5)里氏代换原则:子类型必须能够替换掉他们的父类型。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被服用,而子类也能够在父类的基础上增加新的行为。

6)迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

5、装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

人是一个具体对象,服装店是一个抽象对象,人进入西装店(服装店的一个具体实体)穿了一身西装,然后又进入一件皮鞋店又穿了一双皮鞋,接着进入理发店见了个头发。这里人这个对象经过这些服装店一一装饰。

6、代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

网站A和网站B都是网站(抽象类)的子类,网站有个抽象方法:登陆,在网站B上登陆,网站B却在后台偷偷调用网站A的登陆方法。

7、工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂使一个类的实例化延迟到其子类。

简单工厂,即一个工厂根据客户需求生产不同的产品。而工厂方法则是将工厂抽象出来,将工厂细分,如A工厂只生产A产品,B工厂只生产B产品,现在要A产品则必须先创建一个A工厂出来,生产B产品得创建一个B工厂,而不是都由原先的一个工厂生产。

8、模板方法模式(TemplateMethod):定义一个操作中的算法的骨架,而将一些步骤延至到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

父类有一个非抽象方法(func)调用自己的抽象方法(Abstract funcstion),而这些抽象类又是在子类中实现,创建出实体对象后,客户端调用这个父类的func就可以了。

9、外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

Facade对象有两个方法Method1和Method2,Facade里面有四个A、B、C、D四个对象属性,每个对象分别有funA(),funB(),funC(),funD(),这里这里将Method1调用A的funA()和D的funD(),这里这里将Method2()调用B的funB()和C的funC(),看看迪米特法则,再看这:外观类,他需要了解所有子系统的方法和属性,进行组合,使得这一子系统更加容易使用。

10、建造者模式(Builder):将一个复杂的对象与它的表示分离,使得同样的构建过程可以创建不同的表示。

想想《系统程序员成长计划》一书上的xml解析器。

11、观察者模式(Publish/Subscribe):定义一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,是他们能够自动更新自己。

一个Subjuect对象,里面有个观察者(抽象对象)数组,可以添加观察者,当状态发生变化是,调用notify()方法,遍历数组通知各个观察者。

12、委托和反射:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。

可否理解委托为一个函数指针?反射是否可以这样理解:传递一个“People”给createClass()函数,就创建一个People对象,传递一个“Animal”给它,就创建一个Animal对象。

13、抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

这个看http://blog.csdn.net/humanbeng/article/details/7176751

14、状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

 上下文Context对象里面有一个状态,State抽象对象的抽象方法handle(Context c)处理这个上下文,StateA,StateB,StateC的handle(Context c)方法将切换Context中的State的对象,使A、B、C他们自己在切换。

15、适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。

姚明在NBA的翻译,负责他的语言,使他和其他球员一样说话。

16、备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

17、未完待续....

原创粉丝点击