第一部分基础
第1章设计模式概述
复用面向对象代码的简单方法
1.1定义设计模式
创建型:创建而不是实例
结构型:一组对象组合为更大的结构
行为型:系统内对象间的通信,流程控制
1.2学习过程
接受,认可,领会
1.3学习设计模式
设计模式一书,Gof
smalltalk companion一书
1.4关于面向对象的方法
对接口编程
优先使用对象集合
1.5c#设计模式
1.6本书的组织结构
基础知识
UML
23种设计模式
创建型,结构型,行为型
第2章c#语言的语法
第3章用c#编写windows程序
第4章在c#中使用类和对象
第5章继承
第6章UML图
+公有-私有,静态方法下划线,抽象斜体
6.1继承
实线加空心箭头
6.2接口
虚线加空心箭头
6.3组合
包含对象实例用实心菱形1加实心箭头,如果是多个实例,加*或0
6.4图注
带折角的方框或直接在线段加文本注释
6.5用WithClass绘制UML图
第7章c#中的文件、数组和异常
第二部分创建型模式
将创建过程抽象成一个专门的创造器类
第8章简单工厂模式SimpleFactory
不属于23个Gof模式
8.1简单工厂模式如何工作
返回哪个实例完全取决于工厂
public class XFactory
{
public X getClass(int spec) {
switch(spec) {
case 1:
return new XY();
case 2:
return new XZ();
default:
return new X();
}
}
}
8.2 3 4示例代码
public class NameFactory {
public NameFactory() {}
public Namer getName(string name) {
int i = name.IndexOf (",");
if(i > 0)
return new LastFirst (name);
else
return new FirstFirst (name);
}
}
Namer nm = nameFact.getName (txName.Text );
txFirst.Text = nm.getFrname ();
txLast.Text = nm.getLname ();
8.5数学计算中的工厂模式
8.6小结
简单工厂能返回具有同样方法的类的实例,可能是派生类,可能是接口
第9章工厂方法模式FactoryMethod
简单工厂中有一个专门的类负责实例化,工厂方法对这种思想进行了扩展,不用专门的类实例化。超类把这种决定延迟到每个子类。抽象类创建对象,子类决定创建哪一种对象。
泳道分配:每个子类方法实现不同,返回的具体对象也不同
第10章抽象工厂模式AbstractFactory
返回一系列相关类中的某一个
汽车厂相当于工厂,配件相当于相关类
10.1花园规划工厂
花园是工厂,植物是配件
隔离要生成的具体类,实际类名隐藏在工厂里
有相同的基类
第11章单件模式Singleton
11.1使用静态方法创建单件
public class Spooler {
static bool instance_flag = false; //true if one instance
private Spooler() {}
public Spooler GetSpooler(){
if(!instance_flag)
return new Spooler();
else
return null;
}
}
11.2 3 4异常与实例
public class Spooler {
static bool instance_flag = false; //true if one instance
public Spooler() {
if (instance_flag)
throw new SingletonException("Only one printer allowed");
else
instance_flag=true; //set flag for one instance
Console.WriteLine ("printer opened");
}
}
11.5提供一个单件的全局访问点
使用类的静态方法
第12章生成器模式Builder
比工厂模式稍复杂,返回由显示对象的不同集合构成的完全不同的用户界面。
12.1一个投资跟踪程序
新建工厂类,根据数量初始化不同的显示面板类
12.2使用ListBox中的Items集合
ListItem可以是任何有ToString()的对象
12.3生成器模式的效果
抽象工厂返回的是一系列相关的类,生成器是根据给他的数据一步一步构造复杂的对象。
由某个类确定组成最终类的部件或细节
工厂类叫Director,返回对象叫Builder
第13章原型模式Prototype
确定了通用类,具体类要到运行时才能确定时
由某个类确定组成最终类的部件或细节
目标类是通过克隆一个或多个原型类并修改来实现
13.1C#中的克隆
唯一用在DataSet处理
ds.Clone(),不会产生两个数据拷贝,只生成两个行指针
13.2使用原型
通过Clone()
13.3克隆类
浅拷贝
深拷贝
13.4使用原型模式
需要创建大量的类,或类创建后需要修改。只要有相同的接口
13.5原型管理器
创建型模式小结
第三部分结构型模式
如何组合类和对象以获得更大的结构
继承接口,对象组合
第14章适配器模式Adapter
实现接口或添加方法
14.1在列表之间移动数据
单个数据从一个列表框复制到另一个列表框
14.2创建一个适配器
包装对象,添加方法,方便使用
14.3使用DataGrid
14.4使用Treeview
包装对象,适配器类都实现相同的接口
14.5类适配器
派生类,添加接口方法
类适配器不能匹配子类;对象适配器构造时传递子类就可以匹配子类
第15章桥接模式Bridge
类的接口和实现分离
15.1 2 3桥接接口
15.4扩展Bridge
只需修改接口方法就可有不同的实现
添加新的实现接口的类就可以方便的进行扩展
15.5Windows窗体充当Bridge
属性窗口
第16章组合模式Composite
构建部分-整体层次结构或树形表示
对象的集合(对象可以是简单型也可以是组合型)
建议:不管对象是简单型还是组合型,都要有相同的接口
16.1一个组合的实现
组织结构慢慢壮大
16.2计算薪水
员工成本:自己和所有下属的薪水总和,提取公有接口方法GetSalaries()
16.3Employee类
定义员工接口,实现,某些不允许方法抛出异常
16.4Boss类
16.5构造Employee树
.net中的窗体、控件、框架、容器等也是组合模式的实现。
第17章装饰模式Decorator
改变单个对象的行为,但不需要创建一个新的派生类。
Decorator是一个图形对象,包含了要装饰的对象。
17.1装饰一个CoolButton
Decorator应该是一个抽象类,应该派生于某个通用的可视化组件。
派生于Panel,定义mouse事件处理方法,通过paint设置效果。
17.2处理Decorator中的事件
把Panel中的控件的事件绑定到方法
按钮添加到Panel派生类中,从窗体控件集合中移除按钮
17.3多个Decorator
把PanelDecorator包装在另一个Decorator面板中
17.3非可视化的Decorator
把一个类的实例放在另一个类中
第18章外观模式Facade
将一系列复杂的类包装成一个简单的封闭接口,如ADO.NET的ODBC
18.1什么是数据库
18.2从数据库中取出数据
18.3数据库的种类
18.4ODBC
18.5数据库的结构
ADO.NET针对的是ActiveX的对象,XML,非连接处理
18.6使用ADO.NET
OleDbConnection等类
18.7使用ADO.NET向数据表添加数据行
OleDbDataAdapter.Update()
18.8构建外观模式的各个类
第19章享元模式Flyweight
可以避免大量非常相似的类的开销
使实例唯一的内部数据和作为参数传递的外部数据,适合于小的、细粒度的类
如多个文件夹的图标显示,没必要每个文件夹图标创建一个实例
19.1讨论
Flyweight是一个类的可共享实例。
能否从类中移出某些数据存储到外部
19.2示例代码
第20章代理模式Proxy
复杂对象或费时间对象表示成简单对象时,推迟创建过程。
20.1示例代码
为对象提供相同的接口,推迟创建
20.7结构型模式小结
第四部分行为型模式
通常和对象之间的通信有关
第21章职责链Chain of Responsibility
允许多个类处理同一个请求,而不需要了解彼此的功能。
类之间松散耦合,请求在类之间传递,知道其中一个类处理
从特殊到一般
不能保证任何情况都有响应
21.1适用范围
职责链通常都用于分析器及编译器
21.2 3示例代码
21.4设计一个帮助系统
21.5链的树形结构
第22章命令模式Command
只将请求转发给一个特定对象
22.1动机
事件处理指向一个公共处理程序,调用实现Command接口的对象的接口方法
22.2命令对象
22.3构建Command对象
22.4命令模式的效果
22.5CommandHolder接口
22.6提供Undo操作
第23章解释器模式Interpreter
为某种语言定义一个文法,并用该文法解释语言中的语句。
23.1动机
23.2适用性
23.3一个简单的报表例子
Print fieldname1 fieldname2 sortby fieldname1 thenby fieldname2
23.4解释语言
23.5用于分析的对象
23.7实现解释器模式
第24章迭代器模式Iterator
允许使用一个标准的接口顺序访问一个数据列表或集合,不需知道内部细节。
24.1动机
24.2迭代器示例代码
实现IEnumrator接口
24.3过滤迭代器
24.4记录俱乐部
第25章中介者模式Mediator
促进类之间的松散耦合
25.1一个例子
列表框选择一项,某个按钮可用,单击按钮进行操作,另一个按钮可用,操作后又都不可用
25.2控件间的相互协作
25.3示例代码
每个类都知道Mediator并告诉Mediator自己的存在
25.4 5Mediator对象和Command对象
25.6单接口的中介者
只定义一个多态接口方法,传递不同对象
第26章备忘录模式Memento
保存对象的数据以便以后能够恢复
26.1动机
备忘录模式可通过特权访问要保存对象的状态
三个角色:发起人,备忘录,负责人
26.2实现
Internal关键字
26.3示例代码
26.4用户界面中的命令对象
第27章观察者模式Observer
同时以几种形式表示数据
27.1观察颜色变化
27.2发给观察者的消息
第28章状态模式State
对象表示应用程序状态,转换对象来转换程序状态
28.1示例代码
选中一个按钮并单击或拖动时,每个按钮所做的事情都不一样
28.2状态之间的转换
通过设置currentState对象
28.3Mediator如何与StateManager相互协作
28.4处理Fill状态
28.5处理Undo列表
第29章策略模式Strategy
从不同算法中选择一个合适的算法
29.1动机
不同的策略封装在一个模块中,提供一个简单的接口在策略中选择
29.2示例代码
29.3Context类
决定执行哪种策略
29.4程序中的Command对象
29.5状态图和条形图策略
29.6用C#绘制图形
第30章模板方法模式TemplateMethod
创建一个基类,一个或多个方法留到派生类实现
30.1动机
30.2Template类中的方法种类
完整方法,抽象方法,钩子方法(virtual),模板方法(调用其他方法)
30.3示例代码
30.4三角形绘图程序
30.5模板与反向调用
第31章访问者模式Visitor
可以创建一个外部类来操作其他类中的数据
31.1动机
31.2何时使用访问者模式
不更改源代码向类库添加功能
31.3示例代码
31.4访问类
31.5访问几个类
31.6Boss也是Employee
31.7Visitor的杂物箱操作
31.8双分派