设计模式考试总结
一、面向对象的设计原则:
1)面向对象的设计原则概述:
答:面向对象的设计原则分为可维护性和可复用性两种。
可维护性(Maintainability):指软件能够被理解、改正、适应及扩展的难易程度
可复用性(Reusability):指软件能够被重复使用的难易程度
面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码
的复用,另一方面要确保系统能够易于扩展和修改,具有良好的可维护性。
1. 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个
类中
2. 开闭原则:软件实体应当对扩展开放,对修改关闭
3. 里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象。
4. 依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该
依赖于细节,细节应该依赖于抽象
5. 接口隔离原则:客户端不应该依赖那些它不需要的接口
6. 合成复用原则:优先使用对象组合,而不是继承来达到复用的目的
7. 迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与
本单位密切相关的软件单位。
二、三类模式:创建型模式,行为型模式恶化结构型模式,每一个模式都属于哪一类?
答:1.创建型模式(Creational Pattern)关注对象的创建过程
创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的
使用分离,对用户隐藏了类的实例的创建细节
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对
象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
2.创建型模式包含的种类:
1) 简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,
被创建的实例通常都具有共同的父类。
2)工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实
例化。工厂方法模式让一个类的实例化延迟到其子类。
3)抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定
它们具体的类。
4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可
以创建不同的表示。
5)原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创
建新的对象。
6)单例模式:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一
实例。
3.结构性模式:结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成
更加强大的结构不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向
对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案:
类结构型模式:关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中
一般只存在继承关系和实现关系
对象结构型模式:关心类与对象的组合,通过关联关系,在一个类中定义另一个类的
实例对象,然后通过该对象调用相应的方法。
4.结构型模式包含的种类:
1)适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那
些接口不兼容的类可以一起工作。
2)桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
3)组合模式:组合多个对象形成树形结构,以表示具有部分-整体关系的层次结构。
组合模式让客户端可以统一对待单个对象和组合对象。
4)装饰模式:动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模
式提供了一种比使用子类更加灵活的替代方案。
5)外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个
高层接口,这个接口使得这一子系统更加容易使用。
5. 行为型模式:行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系
统在运行时对象之间的相互通信与协作,进一步明确对象的职责。行为型模式不仅仅关注类
和对象本身,还重点关注它们之间的相互作用和职责划分
类行为型模式:使用继承关系在几个类之间分配行为,主要通过多态等方式来分配父
类与子类的职责
对象行为型模式:使用对象的关联关系来分配行为,主要通过对象关联等方式来分配
两个或多个类的职责
6.行为型模式包含的种类:
1)备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象
之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
2)观察者模式:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发
生改变时,其相关依赖对象都得到通知并被自动更新。
3)状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎
修改了它的类。
4)策略模式:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换,
策略模式让算法可以独立于使用它的客户变化。
5)模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模
板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。
6)访问者模式:表示一个作用于某对象结构中的各个元素的操作。访问者模式让
你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
三、模式的类图:
1.策略模式的类图:
Context
- strategy : Strategy
+ Algorithm ()
...
strategy
Strategy
{abstract}
+ Algorithm ()
...
......
strategy.Algorithm();
......
ConcreteStrategyA
ConcreteStrategyB
+ Algorithm ()
...
+ Algorithm ()
...
2.状态模式的类图:
Context
- state : State
Request ()
+
SetState (State state)
+
...
state
State
+ Handle ()
...
......
state.Handle();
......
3.桥接模式的类图:
Client
ConcreteStateA
ConcreteStateB
+ Handle ()
...
+ Handle ()
...
Abstraction
impl
+ Operation ()
...
impl.OperationImpl();
Implementor
+ OperationImpl ()
...
RefinedAbstraction
ConcreteImplementorA
ConcreteImplementorB
+ Operation ()
...
4.适配器模式的类图:
+ OperationImpl ()
...
+ OperationImpl ()
...
Client
Target
+ Request ()
...
Adaptee
+ SpecificRequest ()
...
Adapter
adaptee
+ Request ()
...
adaptee.SpecificRequest();
适配器模式的结构(对象适配器)
Client
Target
+ Request ()
...
Adaptee
+ SpecificRequest ()
...
Adapter
adaptee
+ Request ()
...
adaptee.SpecificRequest();
适配器模式的结构(对象适配器)
四、编程:
1.单例模式:
1). Program.cs
static void Main()
{
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
2)frmMain.cs
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
private void 窗体一 ToolStripMenuItem_Click(object sender, EventArgs e)
{
//Form1 frm = new Form1();
//frm.MdiParent = this;
//frm.Show();
Form frm = searchMyself(typeof(Form1));
if (frm == null)
frm = new Form1();
frm.MdiParent = this;
frm.Location = new Point(10, 10);
frm.WindowState = FormWindowState.Normal;
frm.Show();
}
Form searchMyself(Type t)
{
foreach (Form item in this.MdiChildren)
{
if (item.GetType() == t)
return item;
}
return null;
}
private void 窗体二 ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 frm = Form2.getInstance();
frm.MdiParent = this;
frm.Location = new Point(10, 10);
frm.WindowState = FormWindowState.Normal;
frm.Show();
}
private void 窗体三 ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form3 frm = Form3.getInstance();
frm.MdiParent = this;
frm.Location = new Point(10, 10);
frm.WindowState = FormWindowState.Normal;
frm.Show();
}
}
3)Form1.cs
public partial class Form1 : Form
{
}
public Form1()
{
InitializeComponent();
}
4)Form2.cs
public partial class Form2 : Form
{
private static readonly Form2 instance = new Form2();
private Form2()
{
InitializeComponent();
}
public static Form2 getInstance()
{
return instance;
}
}
5)Form3.cs
public partial class Form3 : Form
{
private static Form3 instance = null;
private static readonly object syncRoot = new object();
private Form3()
{
InitializeComponent();
}
public static Form3 getInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Form3();
}
}
}
return instance;
}
}