面向对象设计原则

单一职责原则:

类的职责要单一,不能将太多的职责放在一个类中。

开闭原则:

软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础去扩展其功能。

里氏代换原则:

在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。

依赖倒转原则:

要针对抽象层编辑,而不要针对具体类编程。

接口隔离原则:

使用多个专门的接口来取代一个专门的接口。

合成复用原则:

在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。

迪米特法则:

一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。



单例模式

确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。

思路:

首先将构造函数声明成私有类型,屏蔽通过直接实例化的形式来访问。

其次控制全局只有一个实例的类--Static

第三,提供一个可以获得实例的方法,用于返回类的实例,并保证得到的是同一个对象。

示例:

第一种:

class Singleton

{

    private static Singleton singleton;

    private Singleton(){


    }

    public static Singleton getInstance()

    {

        if(singleton==null)

        {

            singleton = new Singleton();

        }

        return singleton;

    }

}

第二种:

class Singleton

{

    private static Singleton singleton=new Singleton();

    private Singleton(){

    

    }

    public static Singleton getInstance(){

        return singleton;

    } 

}


策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。


适配器模式中的有以下三种角色:

抽象策略类(Strategy):定义所以支持的算法公共接口。

具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

环境类(Context):维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。


策略模式实现步骤:

定义抽象策略类

实现具体策略类

定义环境类


观察者模式

两个角色:观察者和被观察者

当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。

实现观察者模式有很多形式,比较直观的一种“注册-通知-撤销注册”的形式。


观察者模式实现步骤:

观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器里。

被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。

观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。


适配器模式

适配器模式有以下四种角色:

目标(target):定义客户端使用的与特定领域相关联的接口。

被适配者(adaptee):定义了一个已经存在的接口,这个接口需要匹配。

适配者(adapter):对Adaptee的接口与target的接口进行适配。

客户端(Client):与符合target接口的对象协同。


类适配器:

确定目标接口

确定被适配者

创建适配器


对象适配器:

确定目标接口

确定被适配者

创建适配器


组合模式

又叫做“整体-部分模式”

它使树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。


组合模式有以下三种角色:

抽象组件类(Component):组合中的对象声明接口,实现所有类共有接口的行为。声明用于访问和管理Component的子部件的接口。

叶子节点(Leaf):叶节点对象,叶节点没有子节点。由于叶子节点不能增加分支和树叶,所以叶节点的Add和Remove没有实际意义。有叶节点行为,用来存储节点集合。

组件集合类(Composite):实现Component的相关操作,比如Add和Remove操作。其中包含Component的容器,用来存储叶节点的集合。


组合模式实现步骤:

定义抽象组件接口

实现叶子节点类,实现抽象组件类的接口

实现组件集合类,实现抽象组件类的接口

定义环境类,讲叶子节点和组件集合加入跟组件集合


装饰模式:

模式中的角色:

装饰者(decorator)是用来装饰的

被装饰者(decoratee)是被装饰的对象


Decorator模式解决的问题:

动态给一个对象添加一些额外的功能和职责。


命令模式

将一个请求封装为对象,从而使你可用不同的请求对客户进行参数化;

命令模式可以对发送者和接收者完全解耦,发生者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。


命令模式的角色

Command:定义命令的接口

ConcreteCommand:命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

Receiver:接收者,真正执行命令的对象。

Invoker:传递者,要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。

Client:创建具体的命令对象,并且设置命令对象的接收者。组装命令对象和接收者,因为真正使用命令的客户端是从Invoker来出发执行的。


状态模式

状态模式解决的问题:

允许一个对象在其内部状态改变的时候改变它的行为。


角色:

环境类(Context):客户使用的对象类。维护一个State子类的实例,这个实例定义当前状态。

抽象状态类(State):定义一个抽象以封装与Context的一个特定状态相关的行为。

具体状态类(ConcreteState):每一子类实现一个与Context的一个状态相关的行为。


状态模式实现步骤如下:

定义抽象状态类,实现当前系统的真实状态继承此自此抽象状态类。

定义Context类,具体状态的类,其中包含抽象状态类的对象。

定义具体状态类,实现当前系统的真实状态类。

当Context类执行某个抽象的方法时,去调用真实状态类的实现方法。

当Context类修改状态时,修改Context类的真实状态对象。


桥接模式

按纬度分成独立部分来对待

然后使用对象组合方式把它们连接起来


迭代器模式

又叫做游标模式

提供一种方法访问一个容器(container)对象中各个元素,而又不暴露该对象的内部细节。

迭代器模式是为容器而生。


迭代器模式包括四种角色:

抽象集合:

一个接口,规定了具体集合需要实现的操作。

具体集合:

具体的集合按照一定的结构存储对象。

具体集合应该有一个方法,该方法返回一个针对该集合的具体迭代器。

抽象迭代器:

一个接口,规定了遍历具体集合的方法,比如next()方法。

具体迭代器:

实现了迭代器接口的类的实例。