软件设计模式复习题1、熟悉每个设计模式的定义、模式UML图解、模式使用情形以及模式优缺点。
2、设计模式的两大主题是什么?3、设计模式分成几大类?每大类各包含哪些模式?4、为什么要使用设计模式?使用设计模式有哪些好处?5、比较抽象工厂模式和工厂方法模式相似性和差异性。
什么情况下使用抽象工厂模式?什么情形下使用工厂方法模式?6、简述原型模式中浅层克隆和深度克隆的区别?分别给出代码说明。
7、模板方法和普通的实现类继承抽象类方式有何区别?8、是比较和分析适配器模式和桥接模式之间的共性和差异性。
9、请用组合模式实现学校人事管理模式。
10、综合应用装饰模式、命令模式和状态模式实现工具条命令按钮鼠标进入时高亮显示状态以及鼠标单击按钮后呈现凹陷状态,表明当前按钮为选中状态。
11、请阐述享元模式是如何节省系统内存的?试举例分析使用享元模式前后的内存节约之比。
12、使用解析器模式实现对学生成绩表的查询输入语句进行解析并执行查询,成绩表结14、试比较和分析中介者模式和观察者模式之间的相似性和差异性?两者是否能够相互转化?15、模板方法和普通的抽象类继承有什么区别?16、使用访问者模式对12题中的学生信息进行报到。
1、熟悉每个设计模式的定义、模式UML图解、模式使用情形以及模式优缺点。
(见书)答:单件模式:○1单例模式:class Singleton{private static Singleton instance;private Singleton(){}public static Singleton GetInstance(){if (instance == null) {instance = new Singleton();}return instance; }客户端代码:class Program{static void Main(string[] args) {Singleton s1 = Singleton.GetInstance();Singleton s2 = Singleton.GetInstance();if (s1 = = s2) {Console.WriteLine("Objects are the same instance");} Console.Read();}}○2多线程时的单例(Lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放)class Singleton{private static Singleton instance;private static readonly object syncRoot = new object();private Singleton(){}public static Singleton GetInstance(){lock (syncRoot) {if (instance == null) { instance = new Singleton(); }} return instance ;} }双重锁定:不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理。
同时也能保证多线程的安全性。
class Singleton{private static Singleton instance;private static readonly object syncRoot = new object();private Singleton(){ }public static Singleton GetInstance(){if (instance == null) {lock (syncRoot) {if (instance == null) { instance = new Singleton();}}}return instance;}静态初始化:不需要开发人员显示地编写线程安全代码,即可解决多线程环境下它是不安全的问题。
public sealed class Singleton{private static readonly Singleton instance=new Singleton();private Singleton(){}public static Singleton GetInstance(){return instance; }}组合模式:●透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add、Remonve等。
这样实现Component接口的所有子类都具备了Add和Remove。
这样做的好处就是叶节点和枝节点对外界没有区别,他们具备完全一致的行为接口。
●安全方式:在Component接口中不去声明Add和Remove方法,那么子类的Leaf也就不要去实现它,而是在Composite声明所有用来管理子类对象的方法。
由于不透明,客户端要做判断。
外观模式:创建的Façade2、设计模式的两大主题是什么?答:对象组合,类继承的讨论3、设计模式分成几大类?每大类各包含哪些模式?答:模式大体上分为3类,分别从对象的创建、对象的结构和对象的行为这3个方面来总结软件开发人员在设计方面的经验。
(1)创建型模式单件模式(Singleton):单例模式确保某一个类有且仅有一个实例,并且提供了一个全局的访问点,切自行实例化并向整个系统提供这个实例。
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
(抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。
因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。
换言之,也就是这些抽象产品的具体子类的实例。
工厂类负责创建抽象产品的具体子类的实例。
)建造者模式(Builder):将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。
建造模式使得产品内部表象可以独立地变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
工厂方法模式(Factory Method):抽象工厂类负责定义创建对象的接口,具体对象的创建工作由实现抽象工厂的具体工厂类来完成。
工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
原型模式(Prototype):通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。
(没有的)简单工厂模式(Simple Factory):定义一个具体的工厂类来负责创建一些类的实例,而这些被创建的类都应该有一个共同的父类,这样就可以实现面向抽象而不是面向具体编程。
客户类和工厂类分开,客户类任何时候需要某种产品,只需向工厂请求即可,客户类无需修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
(2)结构型模式适配器模式(Adapter):把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。
(将类自己的接口包裹在一个已存在的类中。
)桥接模式(Bridge):将抽象化与实现化脱耦,使得两者可以独立地变化,也就是指在一个软件系统的抽象化和实现化之间使用组合关系而不是继承关系,从而使两者可以独立地变化。
装饰模式(Decorator):装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。
(装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。
它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
)组合模式(Composite):用来描述整体与部分的关系,组合模式使得客户端把一个个单独的成分对象和由它们复合而成的合成对象同等看待。
(有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
)外观模式(Facade):为子系统对外提供的一组接口提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成。
享元模式(Flyweight):享元模式以共享的方式高效地支持大量的细粒度对象,享元模式能做到共享的关键是区分内蕴状态和外蕴状态。
内蕴状态存储在享元内部,不会随环境的改变而有所不同。
外蕴状态是随环境的改变而改变的,享元模式大幅度地降低内存中对象的数量。
代理模式(Proxy):代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。
(3)行为型模式模板方法模式(Template Method):定义一个算法执行的骨架,而将具体的算法延迟到子类中来实现。
命令模式(Command):命令模式把一个请求或者操作封装到一个对象中,命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
(将一组行为抽象为对象,实现二者之间的松耦合。
)迭代器模式(Iterator):可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。
(分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
)观察者模式(Observer):让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
(在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”--一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象)都将得到通知。
如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。
从而实现软件体系结构的松耦合。
)解释器模式(Interpreter Pattern):解释器模式属于行为型模式,其意图是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
中介者模式(Mediator Pattern):把各个组件(对象)之间的复杂交互通讯通过其中的一个“中介者”来处理。
提供一种松耦合的方式,解决对个对象之间复杂的交换问题。