面向对象设计原则
单一职责原则:
类的职责要单一,不能将太多的职责放在一个类中。
开闭原则:
软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础去扩展其功能。
里氏代换原则:
在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
依赖倒转原则:
要针对抽象层编辑,而不要针对具体类编程。
接口隔离原则:
使用多个专门的接口来取代一个专门的接口。
合成复用原则:
在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。
迪米特法则:
一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。
单例模式
确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。
思路:
首先将构造函数声明成私有类型,屏蔽通过直接实例化的形式来访问。
其次控制全局只有一个实例的类--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()方法。
具体迭代器:
实现了迭代器接口的类的实例。