1、创建型模式
1)单件(Singleton)模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
2)工厂方法(Factory Method)模式,抽象工厂(Abstract Factory)模式,创建者(Builder)模式都需要一个额外的工厂类来负责实例化“易变对象”,而原型(Prototype)模式则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
3)如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。
2、结构型模式
1)适配器(Adapter)模式注重转换接口,将不吻合的接口适配对接。
2)桥接(Bridge)模式注重分离接口与其实现,支持多维度变化。
3)组合(Composite)模式注重统一接口,将“一对多”的关系转化为“一对一”的关系。
4)装饰(Decorator)模式注重稳定接口,在此前提下为对象扩展功能。
5)外观(Facade)模式注重简化接口,简化组件系统与外部客户程序的依赖关系。
6)享元(Flyweigth)模式注重保留接口,在内部使用共享技术对对象存储进行优化。
7)代理(Proxy)模式注重假借接口,增加间接层来实现灵活控制。
3、行为型模式
1)模版方法(Template Method)模式封装算法结构,支持算法子步骤变化。
2)策略(Strategy)模式注重封装算法,支持算法的变化。
3)状态(State)模式注重封装与状态相关的行为,支持状态的变化。
4)备忘录(Memento)模式注重封装对象状态变化,支持状态保存/恢复。
5)中介者(Mediator)模式注重封装对象间的交互,支持对象交互的变化。
6)职责链(Chain Of Responsibility)模式注重封装对象责任,支持责任的变化。
7)命令(Command)模式注重将请求封装为对象,支持请求的变化。
8)迭代器(Iterator)模式注重封装集合对象内部结构,支持集合的变化。
9)解释器(Interpreter)模式注重封装特定领域变化,支持领域问题的频繁变化。
10)观察者(Observer)模式注重封装对象通知,支持通信对象的变化。
11)访问者(Visitor)模式注重封装对象操作变化,支持在运行时为类层次结构动态添加新的操作。
4、实例:切割文件
//记录进度条进度
public class CutFileEventArgs
{
private double _value;
public double Value
{
get
{
return this._value;
}
set
{
this._value = value;
}
}
}
//委托代替观察者模式
public delegate void MyDelegate(object sender, CutFileEventArgs args);
/// <summary>
/// 接口:分割文件
/// </summary>
public interface ISplitFile
{
/// <summary>
/// 文件名称
/// </summary>
string FileNmae
{
get;
set;
}
/// <summary>
/// 分割个数/分割大小
/// </summary>
int CutNumber
{
get;
set;
}
/// <summary>
/// 开始分割
/// </summary>
/// <returns></returns>
void StartCut();
event MyDelegate CutEvent;
}
/// <summary>
/// 按分文件个数切割文件
/// </summary>
public class CutFileNumber : ISplitFile
{
private string _fileName;
private int _cutNumber;
//响应进度条的事件
public event MyDelegate CutEvent;
public CutFileNumber(string fileName, int cutNumber)
{
this._fileName = fileName;
this._cutNumber = cutNumber;
}
public string FileNmae
{
get
{
return this._fileName;
}
set
{
this._fileName = value;
}
}
public int CutNumber
{
get
{
return this._cutNumber;
}
set
{
this._cutNumber = value;
}
}
public void StartCut()
{
FileStream fsRead = new FileStream(_fileName, FileMode.Open);
long length = fsRead.Length;
BinaryReader reader = new BinaryReader(fsRead);
CutFileEventArgs args = new CutFileEventArgs();
int writerLength = (int)length / _cutNumber;
int lastLength = writerLength + (int)length % _cutNumber;
for (int i = 0; i < _cutNumber; i++)
{
if (CutEvent != null)
{
args.Value = (double)i / (double)_cutNumber;
this.CutEvent(this, args);
}
//从dsRead中读取数据
byte[] data;
if (i == _cutNumber - 1)
{
data = reader.ReadBytes(lastLength);
}
else
{
data = reader.ReadBytes(writerLength);
}
//将读取出来的数据写入一个新的文件中
string newFileName = _fileName + (i + 1) + "split";
FileStream newFS = new FileStream(newFileName, FileMode.Create);
BinaryWriter writer = new BinaryWriter(newFS);
writer.Write(data);
writer.Close();
newFS.Close();
}
}
}
5、设计模式应用总结
1)设计模式建立在对系统变化点的基础上进行,哪里有变化点,哪里用设计模式。
2)设计模式应该以演化的方式来获得,系统的变化点往往是经过不断演化才能准确定位。
3)不能为了模式而模式,设计模式是一种软件设计的软力量,而非规范标准。不应夸大设计模式的作用。