2014年设计模式考试题
1. 设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取GIF格式的图片,JPEG格式图片读取器(JpegReader)用于读取JPEG格式的图片,Tiff格式图片读取器(TiffReader)用于读取Tiff格式的图片。图片读取器对象通过图片读取器工厂(ImageReaderFactory)来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory、JpegReaderFactory和TiffReaderFactory用于创建具体的图片读取器对象。请使用工厂方法模式实现该程序的设计,并使用UML画出该模式的类图。
word/media/image1.gif
package com;
public interface ImageReaderFactory {
// 读取
public void read() ;
// 完成
public void finish() ;
}
public class JpegReaderFactory implements ImageReaderFactory{
public void read()
{
System.out.println("读取JPEG图片中... ....") ;
}
public void finish()
{
System.out.println("JPEG图片读取完成") ;
}
}
public class GifReaderFactory implements ImageReaderFactory{
public void read()
{
System.out.println("读取GIF图片中... ... ") ;
}
public void finish()
{
System.out.println("GIF图片读取完成") ;
}
}
public class TiffReaderFactory implements ImageReaderFactory{
public void read()
{
System.out.println("读取TIFF图片中... ...") ;
}
public void finish()
{
System.out.println("TIFF图片读取完成... ...") ;
}
}
class Factory
{
public static ImageReaderFactory getImageReaderInstance(String type)
{
ImageReaderFactory f = null ;
if("Jpeg".equals(type))
{
f = new JpegReaderFactory() ;
}
if("Tiff".equals(type))
{
f = new TiffReaderFactory();
}
if("Gif".equals(type))
{
f = new GifReaderFactory() ;
}
if("jpeg".equals(type))
{
f = new JpegReaderFactory() ;
}
if("tiff".equals(type))
{
f = new TiffReaderFactory();
}
if("gif".equals(type))
{
f = new GifReaderFactory() ;
}
return f ;
}
};
public class ImageReaderClient {
public static void main(String[] args)
{
if(args.length==0)
{
System.out.println("请输入需要读取的图片类型") ;
/*System.exit(1) ;*/
}
ImageReaderFactory f = Factory.getImageReaderInstance(args[0]) ;
/*ImageReaderFactory f = Factory.getImageReaderInstance("gif") ;*/
if(f!=null)
{
f.read() ;
f.finish() ;
}
else
{
System.out.println("不支持该类型图片。") ;
}
}
}
2. 实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫,狗可以学猫抓老鼠。请使用UML画出相应类图并给出编程设计代码。
word/media/image2.gif
package com;
public interface Icat {
//猫的外表
public void catLooks();
// 猫捉老鼠
public void zhuoshu();
}
public interface Idog {
//狗的外表
public void dogLooks();
// 狗叫
public void bark();
}
public class ArealCat implements Icat{
public void catLooks(){
System.out.println("I am a real cat, I have a catLooks.");
};
// 狗叫
public void zhuoshu(){
System.out.println("I am a real cat, I can catch a mouse.");
};
}
public class ArealDog implements Idog{
//狗的外表
public void dogLooks(){
System.out.println("I am a real dog, I have a dogLooks.");
};
// 狗叫
public void bark(){
System.out.println("I am a real dog, I can bark.");
};
}
public class ATwoFaceadapter implements Idog,Icat{
Icat cat=null;
public ATwoFaceadapter(Icat cat){
this.cat = cat;
}
public void dogLooks() {
// 假装自己是一条狗
System.out.println("I am a dog,too!");
// 隐藏自己的外貌
// cat.catLooks();
}
public void bark() {
cat.zhuoshu();
}
Idog dog=null;
public ATwoFaceadapter(Idog dog){
this.dog = dog;
}
public void catLooks() {
// 假装自己是一只猫
System.out.println("I am a cat,too.");
// 隐藏自己的外貌
// dog.dogLooks();
}
public void zhuoshu() {
dog.bark();
}
}
public class Main {
public static void main(String[] args) {
// 把一条狗适配成一只猫
Icat AFakeCat = new ATwoFaceadapter(new ArealDog());
AFakeCat.catLooks();
AFakeCat.zhuoshu();
// 把一只猫适配成一条狗
Idog AFakeDog = new ATwoFaceadapter(new ArealCat());
AFakeDog.dogLooks();
AFakeDog.bark();
}
}
3. 某银行软件的利息计算流程如下:系统根据账户查询用户信息;根据用户信息判断用户类型;不同类型的用户使用不同的利息计算方式计算利息(如活期账户CurrentAccount和定期账户SavingAccount具有不同的利息计算方式);显示利息。请使用模板方法模式来设计该系统,绘制UML类图并给出编程设计代码。
word/media/image3.gif
package com;
public abstract class AbstractClass {
//定义一个模板方法来控制用户帐户查询的流程
public void userAccount(){//TemplateMethod
//首先生产手机体(模板方法自己完成)
System.out.println("查询用户帐户信息");
this.findUserType();
this.findInterest();
this.findTotal();
System.out.println("查询完毕!");
//以上模板已经规定好了
}
//定义抽象的方法(不同类型的帐户)
protected abstract void findUserType();
//定义抽象的方法(不同利率)
protected abstract void findInterest();
//定义抽象的方法(不同利息)
protected abstract void findTotal();
}
public class CurrentAccount extends AbstractClass {
protected void findUserType() {
System.out.println("该用户为活期存款帐户");
}
protected void findInterest() {
System.out.println("活期存款利率为0.35%");
}
protected void findTotal() {
System.out.println("该用户存入1000元,年利息为3.5元");
}
}
public class SavingAccount extends AbstractClass{
protected void findUserType() {
System.out.println("该用户为定期存款帐户");
}
protected void findInterest() {
System.out.println("定期存款利率为3.25%");
}
protected void findTotal() {
System.out.println("该用户存入1000元,年利息为32.5元");
}
}
public class Main {
public static void main(String args[]){
AbstractClass ac01 = new CurrentAccount();//子类的对象付给父类
ac01.userAccount();//查询帐户
AbstractClass ac02 = new SavingAccount();//子类的对象付给父类
ac02.userAccount();//查询帐户
}
}
4. 请查阅文献,并结合个人的学习和实践体会,举例谈谈你对设计模式的认识,以及某个特定的设计模式(自选)在面向对象程序设计中的重要作用。
软件开发过程中,一个系统的关键是设计,如果系统设计的很好,那么在后续开发中就能少走弯路,并且在系统维护中,能够简单、轻松。但如果系统设计中就出现了问题,那么这个系统的开发必然是痛苦的。所以人们把软件开发过程中有价值的经验进行提炼和总结,得到了很多的模式。这些模式很清晰的说明了它们所表达的关联、问题和解决方式之间的关系。这些在软件设计上积累、抽象出来的模式被称之为设计模式。
模式是一条规则,告诉你应该如何创建一个实物、应该在何时创建。它既是过程,也是实物;既是对当前实物的描述,也是对创建实物的过程的描述。
本学期共学习了二十三个模式,这些模式可以分成三类,创建型模式、结构性模式和行为模式。各类模式都是在不同场景下,解决不同问题的方案。
下面具体谈谈行为模式:
行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将你的注意力从控制流转移到对象间的联系方式上来。
行为类模式使用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。
状态模式(State Pattern)属于行为模式的一种。状态模式的定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
状态模式适用于下面的场景
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
状态模式将与特定状态相关的行为局部化,并且将不同的状态行为分割开来,也就是将特定状态的相关行为都放在一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换,同时减少了相互之间的依赖。
以机房收费系统系统中的登陆为例,对于登陆这个行为,需要如下的工作:
判断用户名是否存在
判断密码是否存在
检查用户是否以在线
登陆成功将记录保存起来
这一些列的过程符合上面介绍的条件,因此可以状态模式来解决此问题,同时也增加了代码的灵活性。
总而言之,设计模式可以使人们更加方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统的开发者更加容易理解其设计思路。设计模式可以做出有利于系统间潜在联系的说明规范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。
本文来源:https://www.2haoxitong.net/k/doc/bb2396f051e79b89680226bb.html
文档为doc格式