设计模式——初步学习

参考:http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750445

   http://baike.baidu.com/link?url=OhPS9yyf4pqRbfzFkEusLhNVbyEtnmuuAJCfms-26pXHfHh80zRdiVbByBUSz1Xgv3yt7eNaoyXu7h0_vHt8_K

百度百科中关于设计模式的定义:一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

设计模式的本质是面向对象方法的实际运用,具体而言,是封装、继承、多态和关联的反复使用。

面向对象有几个原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成/聚合复用原则、最小知识原则(也叫迪米特法则)。

开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。

 

开闭原则

循开闭原则设计出的模块具有两个主要特征:
(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。
 

里氏代换原则

里氏代换原则(LSP)是面向对象设计的基本原则之一。 里氏代换原则:任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
 

依赖倒转原则

指在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单的说,子类型能够替换掉它们的父类型。依赖性倒转其实可以说是面向对象设计的标志,用哪种语言编程并不是很重要。
 

接口隔离原则

①使用多个专门的接口比使用单一的总接口要好。②一个类对另外一个类的依赖性应当是建立在最小的接口上的。③一个接口代表一个角色,不应当将不同的角色都交给一个接口。④没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。⑤不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。
 

合成/聚合复用原则

合成/聚合复用原则(CARP)经常又叫做合成复用原则。合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。在Java中,应尽量针对Interface编程,而非实现类。这样,更换子类不会影响调用它方法的代码。
 

最少知识原则(迪米特法则)

迪米特法则的初衷在于降低类之间的耦合。狭义的迪米特法则是指:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用,每个类尽量减少对其他类的依赖,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。广义的迪米特法则的设计原则为:①优先考虑将一个类设置成不变类。②尽量降低一个类的访问权限。③谨慎使用Serializable。④尽量降低成员的访问权限。    
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。
迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
迪米特法则应用的例子:门面模式,中介模式
 
 
 

设计模式通常分为三类:创建型、结构型和行为型

创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式

行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

 

——————————————————————————————————————————————————————————————————————————————

单例模式

单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

适用性:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
Java单例模式例子
public class SingletonClass{
    private static SingletonClass instance=null;
    public static SingletonClass getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new SingletonClass();
                }
            }
        }
        return instance;
    }
    private SingletonClass(){}
}

  

posted @ 2015-10-08 21:56  heshengbang  阅读(199)  评论(0编辑  收藏  举报