C#设计模式读书笔记

本文深入讲解了23种经典的设计模式,包括创建型、结构型和行为型模式。通过具体的代码示例,详细介绍了每种模式的应用场景和实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

第一部分基础

第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双分派

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值