文档库 最新最全的文档下载
当前位置:文档库 › 设计模式大题

设计模式大题

设计模式大题
设计模式大题

5.2.某电影院售票系统为不同类型的用户提供了不同的电影票(CinemaTicket)打折方式(Discount),学生凭学生证可享受8折优惠(StudentDiscount),儿童可享受减免10元的优惠(ChildrenDiscount),VIP用户除享受半价优惠外还可以进行积分(VIPDiscount)。选择一种合适的设计模式来设计该系统。(策略模式)

StudentDiscount

+calculate (double price) ...: double

Discount

+calculate (double price) ...: double

MovieTicket

--price

discount

: double

: Discount

+ + +setPrice (double price)

setDiscount (Discount discount)

getPrice ()

...

: void

: void

: double

ChildrenDiscount

+calculate (double price)

...

: double

VIPDiscount

+calculate (double price)

...

: double

//电影票类:环境类

class MovieTicket

{

private double price;

private Discount discount;

public void setPrice(double price)

{

this.price = price;

}

public void setDiscount(Discount discount)

{

this.discount = discount;

}

public double getPrice()

{

return discount.calculate(this.price);

}

}

//折扣类:抽象策略类

interface Discount

{

public double calculate(double price);

}

//学生折扣类:具体策略类

class StudentDiscount implements Discount {

public double calculate(double price)

{

return price * 0.8;

}

}

//儿童折扣类:具体策略类

class ChildrenDiscount implements Discount

{

public double calculate(double price)

{

return price - 10;

}

}

//VIP会员折扣类:具体策略类

class VIPDiscount implements Discount

{

public double calculate(double price)

{

System.out.println("增加积分!");

return price * 0.5;

}

}

//客户端测试类

class Client

{

public static void main(String args[])

{

MovieTicket mt = new MovieTicket();

mt.setPrice(50.00);

double currentPrice;

Discount obj;

obj = new StudentDiscount(); //可通过配置文件实现

mt.setDiscount(obj);

currentPrice = mt.getPrice();

System.out.println("折后价为:" + currentPrice);

System.out.println("---------------------------------");

obj = new VIPDiscount();

mt.setDiscount(obj);

currentPrice = mt.getPrice();

System.out.println("折后价为:" + currentPrice);

}

public interface Count {

public abstract void discount(double a);

}

public class CiTicket {

private Count disobj;

public void discount(double a){

disobj.discount(a);

}

public void setdisobj(Count disobj){

this.disobj=disobj;

}

}

public class StTicket implements Count{

private double a;

public void discount(double a){

System.out.println("原价为"+a);

this.a=a*0.8;

System.out.println("学生票的票价为原价的8折:"+this.a);

}

}

public class VTicket implements Count{

private double a;

public void discount(double a){

System.out.println("原价为"+a);

this.a=a*0.5;

System.out.println("VIP会员的票价为原价的半价:"+this.a);

System.out.println("VIP会员的会员卡积分一次");

}

public class ChTicket implements Count {

private double a;

public void discount(double a){

System.out.println("原价为"+a);

this.a=a-10;

System.out.println("儿童票的票价为原价减10元:"+this.a);

}

}

public class Client {

public static void main(String[] args) {

CiTicket c=new CiTicket();

Count d = new StTicket();

Count d1 = new ChTicket();

Count d2 = new VTicket();

d.discount(50);

d1.discount(50);

d2.discount(50);

c.setdisobj(d);

c.setdisobj(d1);

c.setdisobj(d2);

}

}

1. 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请用面向对象的语言实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。

import javax.swing.JOptionPane;

/**

* 主要显示类

* @author 陈俊生

*

*/

public class Main {

/**

* 主方法

* @param arg

*/

public static void main(String arg[]){

/*

* 提示输入

*/

/*System.out.println("请大家输入你想让女娲造的人的代号:");*/

String str = "";

/*

* 当输入0时退出程序

*/

while(true){

str = JOptionPane.showInputDialog("请大家输入你想让女娲造的人的代号:");

NvWa nvWa = new NvWa();

Person person = nvWa.madeMan(str);

person.play();

}

}

}

/**

* 男人类

* @author 陈俊生

*

*/

class Man extends Person {

@Override

public void play() {

// TODO Auto-generated method stub

/*System.out.println("大家好,我是男人!我来自地球!");*/

JOptionPane.showMessageDialog(null, "大家好,我是男人!我来自地球!");

}

}

/**

* 女娲类

* 简单工厂类

* @author 陈俊生

*

*/

class NvWa {

/**

* 女娲造人方法

* @param str 根据传递的参数进行造人

* @return

*/

public Person madeMan(String str){

Person person = null;

switch (str) {

/*

* 实例化男人

*/

case "M":

person = new Man();

break;

/*

* 实例化男人

*/

case "W":

person = new Woman();

break;

/*

* 实例化机器人

*/

case "R":

person = new Robot();

break;

default:

/* System.out.println("输入有误,女娲没这个能力造出你需要的人!");*/ person = new Person();

break;

}

return person;

}

}

/**

* 人类

* @author 陈俊生

*

*/

class Person {

/* private String name;//姓名

private int age;//年龄

*/

/**

* 玩的方法

*/

public void play(){

JOptionPane.showMessageDialog(null, "输入有误,我还是一坨泥巴!女娲还没构造我!请重试~");

};

}

/**

* 机器人类

* @author 陈俊生

*

*/

class Robot extends Person {

@Override

public void play() {

// TODO Auto-generated method stub

/*System.out.println("大家好,我是机器人!我来自火星!");*/

JOptionPane.showMessageDialog(null, "大家好,我是机器人!我来自火星!");

}

}

/**

* 女人类

* @author 陈俊生

*

*/

class Woman extends Person {

@Override

public void play() {

// TODO Auto-generated method stub

/*System.out.println("大家好,我是女人!我来自水星!");*/

JOptionPane.showMessageDialog(null, "大家好,我是女人!我来自水星!");

}

}

2.迟到的理由。(简单工厂和工厂模式)

说明:根据迟到的理由不同,如:去厕所,在路上,回家等理由。当老师需要知道是何种理由迟到时只需传入相应的参数,现请使用简单工厂模式来模拟该过程。

此外,如果有同学新增加一个“相亲”理由,为了遵循开闭原则,请使用工厂模式模拟上述过程。

简单工厂模式

import javax.xml.parsers.*;

import org.w3c.dom.*;

import java.io.*;

public class XMLUtilReason{

//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称

public static String getexcuse(){

try{

//创建文档对象

DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = dFactory.newDocumentBuilder();

Document doc;

doc = builder.parse(new File("configReason.xml"));

//获取包含品牌名称的文本节点

NodeList nl = doc.getElementsByTagName("excuse");

Node classNode=nl.item(0).getFirstChild();

String excuse=classNode.getNodeValue().trim();

return excuse;

}

catch(Exception e){

e.printStackTrace();

return null;

}

}

}

public abstract class AbstractReason {

public abstract void reason();

}

public class GoHome extends AbstractReason {

public void reason() {

System.out.println("Go Home!");

}

}

public class GoToilet extends AbstractReason {

public void reason() {

System.out.println("Go to Toilet!");

}

}

public class OnTheWay extends AbstractReason {

public void reason() {

System.out.println("On The Way!");

}

}

public class ReasonFactory {

public static AbstractReason produceReason (String excuse) throws Exception

{

if(excuse.equalsIgnoreCase("Toilet")){

System.out.println("The ReasonFactory produces the reason of Toilet!");

return new GoToilet();

}

else if(excuse.equalsIgnoreCase("Home")){

System.out.println("The ReasonFactory produces the reason of go home");

return new GoHome();

}

else if(excuse.equalsIgnoreCase("OnTheWay")){

System.out.println("The ReasonFactory produces the reason of on the way!");

return new OnTheWay();

}

else {

throw new Exception("Sorry! The reason is not true!");

}

}

}

public class Client_xml {

public static void main(String[] args) {

try{

AbstractReason abstractreason;

String excuse=XMLUtilReason.getexcuse();

abstractreason=ReasonFactory.produceReason(excuse);

//abstractreason=ReasonFactory.produceReason ("Home");

abstractreason.reason();

}

catch(Exception e)

{

System.out.println(e.getMessage());

}

}

}

public class Client {

public static void main(String[] args) {

try{

AbstractReason abstractreason;

abstractreason=ReasonFactory.produceReason ("Toilet"); abstractreason.reason(); }

catch(Exception e) {

System.out.println(e.getMessage()); } }

}

3.简历题目(浅克隆)

需要有一个简历类,必须要有姓名,可以设置性别和年龄,可以设置工作经历。最终需要三份简历。

+clone() : Object

Object Cloneable

+Resume(in name : String)+clone() : Object

+setName(in name : String) : void

+setPersonalInfo(in sex : String, in age : String) : void +getName() : String +getSex() : String +getAge() : String

+setWorExperience(in workDate : String, in Company : S +getWorkExperience() : WorkExperience +display() : void

-name : String -sex : String -age : String

-workexperience : WorkExperience = null Resume

+setworkDate(in workDate : String) : void +setCompany(in Company : String) : void +getworkDate() : void +getCompany() : void

-workDate : String -Company : String

WorkExperience

1

-workexperience

*

public class Resume implements Cloneable { private String name; private String sex; private String age;

private WorkExperience workexperience=null;

public Resume(String name)

{

https://www.wendangku.net/doc/da3539654.html,=name;

this.workexperience=new WorkExperience();

}

public void setName(String name)

{

https://www.wendangku.net/doc/da3539654.html,=name;

}

public void setPersonalInfo(String sex, String age)

{

this.sex=sex;

this.age=age;

}

public String getName()

{

return (https://www.wendangku.net/doc/da3539654.html,);

}

public String getSex()

{

return(this.sex);

}

public String getAge()

{

return(this.age);

}

public void setWorkExperience(String workDate, String Company) {

workexperience.setworkDate(workDate);

workexperience.setCompany(Company);

}

public WorkExperience getWorkExperience()

{

return this.workexperience;

}

public Object clone()

{

Resume clone=null;

try

{

clone=(Resume)super.clone();

}

catch(CloneNotSupportedException e)

{

System.out.println("Clone failure!");

}

return clone;

}

public void display()

{

System.out.println("Resume:"+" "+this.getName()+" "+this.getAge()+" "+this.getSex());

System.out.println("Experience:"+" "+workexperience.getworkDate()+" "+workexperience.getCompany());

}

}

public class WorkExperience {

private String workDate;

private String Company;

public void setworkDate(String workDate)

{

this.workDate=workDate;

}

public void setCompany(String Company)

{

https://www.wendangku.net/doc/da3539654.html,pany=Company;

}

public String getworkDate()

{

return (this.workDate);

}

public String getCompany()

{

return(https://www.wendangku.net/doc/da3539654.html,pany);

}

}

public class Client {

public static void main(String args[]){

Resume resume,copy1,copy2;

resume=new Resume("zhangsan");

resume.setPersonalInfo("male", "25");

resume.setWorkExperience("1995-1997","Company1");

copy1=(Resume)resume.clone();

copy2=(Resume)resume.clone();

resume.display();

copy1.setName("lisi");

copy1.setWorkExperience("2004-2007","Company2");

copy1.display();

copy2.setPersonalInfo("female", "30");

copy2.display();

System.out.println(resume==copy1);

System.out.println(copy1==copy2);

System.out.println(resume.getWorkExperience()==copy1.getWorkExperience());

System.out.println(copy1.getWorkExperience()==copy2.getWorkExperience());

}

}

陈俊生版

public class Resume implements Cloneable{

private String name;//姓名

private String sex;//性别

private int age;//年龄

private WorkExperience we ;//工作经历

public Resume(){

this.we = new WorkExperience();

}

/**

* 姓名

* @return

*/

public String getName(){

return name;

}

public void setName(String name){

https://www.wendangku.net/doc/da3539654.html, = name;

}

/**

* 性别

* @return

*/

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

/**

* 年龄

* @return

*/

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

/**

* 获取工作经历对象

*/

public WorkExperience getWorkExperience(){

return we;

}

@Override

public Object clone(){

// TODO Auto-generated method stub

Resume resume = null;

try {

resume = (Resume)super.clone();

} catch (CloneNotSupportedException e) {

// TODO: handle exception

JOptionPane.showMessageDialog(null, "克隆失败!");

e.printStackTrace();

}

return resume;

}

}

public class WorkExperience {

public void setWorkExperience(String str){

JOptionPane.showMessageDialog(null, "设置成功\n"+str);

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Resume resume , cr1 ,cr2 ,cr3;

WorkExperience we1, we2, we3;

resume = new Resume();

cr1 = (Resume)resume.clone();

cr1.setName("张三");

String name1 = cr1.getName();

cr1.setAge(15);

int age1 = cr1.getAge();

cr1.setSex("男");

String sex1 = cr1.getSex();

we1 = cr1.getWorkExperience();

we1.setWorkExperience("我叫"+ name1 + ",我"+age1+ "岁" +",我是"+sex1+"生,是一名java程序猿!");

cr2 = (Resume)resume.clone();

cr2.setName("李四");

String name2 = cr2.getName();

cr2.setAge(20);

int age2 = cr2.getAge();

cr2.setSex("女");

String sex2 = cr2.getSex();

we2 = cr2.getWorkExperience();

we1.setWorkExperience("我叫"+ name2 + "我"+age2+ "岁" +"我是"+sex2+"生,是一名美工!");

cr3 = (Resume)resume.clone();

cr3.setName("王五");

String name3 = cr3.getName();

cr3.setAge(30);

int age3 = cr1.getAge();

cr3.setSex("中性人");

String sex3 = cr1.getSex();

we3 = cr3.getWorkExperience();

we1.setWorkExperience("我叫"+ name3 + "我"+age3+ "岁" +"我是"+sex3+"生,是一名软件测试工程师!");

}

}

设计模式试卷

设计模式期中考试试题 一:单项选择(共20道,每道2分) 1、设计模式一般用来解决什么样的问题( ) A.同一问题的不同表相B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( ) A.继承 B.封装 C.里氏代换D都不是 3、Open-Close原则的含义是一个软件实体( ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用()模式。 A.创建型 B.结构型C行为型D.以上都可以 5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( )的表述 A.开-闭原则 B.接口隔离原则 C.里氏代换原则 D.依赖倒转原则 6、设计模式的两大主题是( ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 7、“不要和陌生人说话” 是( )原则的通俗表述 A.接口隔离 B.里氏代换 C.依赖倒转 D.迪米特:一个对象应对其他对象尽可能少的了解 8、构造者的的退化模式是通过合并()角色完成退化的。 A.抽象产品B产品C创建者D使用者 9、以下关于简单工厂模式叙述错误的是() A 它属于GoF23种设计模式 B 它是最简单的设计模式之一 C 它是学习其他创建型模式的基础 D 它只需要记住一个简单的参数即可获得所需对象的实例 E 它类中的方法通常为静态方法 F 它返回的类都有一个公共的父类和公共的方法 10、对象适配器模式是()原则的典型应用。 A.合成聚合复用原则 B.里式代换原则 C.依赖倒转原则 D.迪米特法则 D.以上表述全部错误。 11.对于依赖倒转的表述错误的是() A.依赖于抽象而不依赖于具体,也就是针对接口编程。 B.依赖倒转的接口并非语法意义上的接口,而是,一个类对其他对象进行调用时,所知道的方法集合。 C.从选项B的角度论述,一个对象可以有多个接口。 D.实现了同一接口的对象,可以在运行期间,顺利地进行替换。而且不必知道所示用的对象是那个实现类的实例。 E.此题没有正确答案。 12. 现有5个产品族,分布于3各不同的产品等级结构,只要指明一个产品所处的产品族以及它所在的等级结构,就可以唯一地确认这个产品。那么使用抽象工厂方法模式只需要提供

吉林大学设计模式期末考试试题答案整理

设计模式分为三种类型,共23种。 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。 工厂模式(Factory) 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适用性 ●当一个类不知道它所必须创建的对象的类的时候。 ●当一个类希望由它的子类来指定它所创建的对象的时候。 ●当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一 信息局部化的时候。 抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 适用性 ●一个系统要独立于它的产品的创建、组合和表示时。 ●一个系统要由多个产品系列中的一个来配置时。 ●当你要强调一系列相关的产品对象的设计以便进行联合使用时。 ●当你提供一个产品类库,而只想显示它们的接口而不是实现时。 建造者模式Builder 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 适用性

●当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 ●当构造过程必须允许被构造的对象有不同的表示时。 原型模式Prototype 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性 ●当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 ●为了避免创建一个与产品类层次平行的工厂类层次时;或者 ●当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用 合适的状态手工实例化该类更方便一些。 单例模式Singleton 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 适用性 ●当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 ●当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例 时。 适配器模式Adapter 意图 将一个类的接口转换成另外一个客户希望的接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适用性 ●你想使用一个已经存在的类,而它的接口不符合你的需求。 ●你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼 容的类)协同工作。 ●(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配 它们的接口。对象适配器可以适配它的父类接口。

设计模式题库(修改后)

1.设计模式的原理? (C) C. 面向接口编程 2. 以下对"开-闭"原则的一些描述错误的是?(A) A. "开-闭"原则与"对可变性的封装原则"没有相似性. 3.以下属于创建型模式是? (A) B.BUILDER (生成器) C. PROTOTYPE (原型) D.SINGLETON (单件) 4.以下属于结构型模式是? (D) COMPOSITE (组合) B. ADAPTER (适配器) B.FLYWEIGHT (享元) 5. 以下属于行为型模式是? (D ) 6. COMMAND (命令) 7. STRATEGY( 策略) 8. MEMENTO (备忘录) /*23 模式意图*/ 6. 以下意图那个是用来描述ABSTRACT FACTORY (抽象工厂)?(A) A.提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 7. 以下意图那个是用来描述BUILDER (生成器)?(B) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 8. 以下意图那个是用来描述FACTORY METHOD (工厂方法)?(C) C.定义一个用于创建对象的接口,让子类决定实例化哪一个类。该模式使一个类的 实例化延迟到其子类。 9. 以下意图那个是用来描述PROTOTYPE (原型)?(D) D.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 10. 以下意图那个是用来描述SINGLETON (单件)?(B) B.保证一个类仅有一个实例,并提供一个访问它的全局访问点。

11. 以下意图那个是用来描述ADAPTER (适配器)?(A) A.将一个类的接口转换成客户希望的另外一个接口。本模式使得原本由于接口不兼容 而不能一起工作的那些类可以一起工作。 12. 以下意图那个是用来描述BRIDGE (桥接)?(B) B.将抽象部分与它的实现部分分离,使它们都可以独立地变化。 13. 以下意图那个是用来描述COMPOSITE (组合)?(C) C.将对象组合成树形结构以表示“部分-整体”的层次结构。 14. 以下意图那个是用来描述DECORATOR (装饰)?(D) 动态地给一个对象添加一些额外的职责。 15. 以下意图那个是用来描述FACADE (外观)?(A) A.为子系统中的一组接口提供一个一致的界面,本模式定义了一个高层接口,这个接 口使得这一子系统更加容易使用。 16. 以下意图那个是用来描述FLYWEIGHT (享元)?(B) B.运用共享技术有效地支持大量细粒度的对象。 17. 以下意图那个是用来描述PROXY (代理)?(C) C.为其他对象提供一种代理以控制对这个对象的访问。 18. 以下意图那个是用来描述CHAIN OF RESPONSIBILITY( 职责链)?(D) D.使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 19. 以下意图那个是用来描述COMMAND (命令)?(A) A.将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作 20.以下意图那个是用来描述INTERPRETER( 解释器)?(B) B.给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 21.以下意图那个是用来描述ITERATOR( 迭代器)?(C) 。 C.提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

软件设计模式试题集 含答案

设计模式试题 一.选择 1. 设计模式具有的优点()。 A.适应需求变化 B.程序易于理解 C.减少开发过程中的代码开发工作量 D.简化软件系统的设计 2. 设计模式一般用来解决什么样的问题( )。 A.同一问题的不同表相 B 不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 3. 设计模式的两大主题是( )。 A.系统的维护与开发 B.对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 4. 以下哪些问题通过应用设计模式不能够解决。() A)指定对象的接口B)针对接口编程 C)确定软件的功能都正确实现D)设计应支持变化 二.填空 1. 模式的基本要素包括名称、意图、问题、解决方案、参与者和协作者、(效果)、实现、GoF 参考。 2. 设计模式基本原则包括:开闭原则,(从场景进行设计的原则),包容变化原则。 3. 设计模式是一个(抽象)的方案,它可以解决一类问题。 4. 1. 在设计模式群体中,效果是指(原因和结果)。三. 判断 1. 适配器模式属于创建型模式。错 2. 在设计模式中,“效果”只是指“原因和结果”。对 3. 设计模式使代码编制不能真正工程化。错 4. 设计模式的两大主题是系统复用与系统扩展。对四. 名词解释 1. 设计模式 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 2. 模板 模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 3. 模式 就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。 4. 内聚度 模块内部各成分彼此结合的紧密程度。五.简答 题 1. 什么是设计模式?设计模式的目标是什么?设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验的总结。使用设计模式是为了可 重用代码、让代码更容易被他人理解、保证代码可靠性。 2. 设计模式的基本要素有哪些? 名称,意图,问题,解决方案,参与者和协作者,效果,实现,GOF 参考。 3. 设计模式中一般都遵循的原则有什么? 开-闭原则,根据场景进行设计原则,优先组合原则,包容变化原则。 4. 四人团针对“创建优秀面向对象设计”建议了哪些策略? 针对接口编程,优先使用对象组合而不是类继承,找到并封装变化点。 第6 章 facade(外观)模式 一.选择 1. 外观模式的作用是()。A.当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些 额外的功能。B.为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更 加容易使用。

设计模式课后习题

建造者模式 课后第一题: 产品类: public class GamePerson { private String face; private String gender; private String cloth; public String getFace() { return face; } public void setFace(String face) { this.face = face; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getCloth() { return cloth; } public void setCloth(String cloth) { this.cloth = cloth; } } 抽象建造类: public abstract class PersonCreate { protected GamePerson person=new GamePerson(); public abstract void createFace(); public abstract void createGender(); public abstract void createCloth(); public GamePerson getPerson(){ return person; } }

具体建造者类: public class PersonType1 extends PersonCreate { public void createFace() { person.setFace("瓜子脸"); } public void createGender() { person.setGender("美女"); } public void createCloth() { person.setCloth("洛丽塔"); } } 具体建造类: public class PersonType2 extends PersonCreate { public void createFace() { person.setFace("国字脸"); } public void createGender() { person.setGender("帅哥"); } public void createCloth() { person.setCloth("西装革履"); } } 指挥者类: public class GamePlayer { private PersonCreate pc; public void choseType(PersonCreate pc){ this.pc=pc; } public GamePerson create(){ pc.createCloth(); pc.createFace(); pc.createGender(); return pc.getPerson(); } } 测试类: public class Test { public static void main(String[] args) { PersonCreate pc=new PersonType1();

最新java设计模式考试题资料

1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。 A.创建型 B.结构型 C行为型 D.以上都可以 5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( d )的表述 A.开-闭原则 B.接口隔离原则 C.里氏代换原则 D.依赖倒转原则 6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。 A, 委派 B.继承 C创建 D.以上都不对 复用方式:继承和组合聚合(组合委派) 7、设计模式的两大主题是( d ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 8、单子模式中,两个基本要点( a b )和单子类自己提供单例 A .构造函数私有 B.唯一实例 C.静态工厂方法 D.以上都不对 9、下列模式中,属于行为模式的是( b ) A.工厂模式 B观察者 C适配器以上都是 10、“不要和陌生人说话” 是( d )原则的通俗表述 A.接口隔离 B.里氏代换 C.依赖倒转 D.迪米特:一个对象应对其他对象尽可能少的了解 11、构造者的的退化模式是通过合并( c )角色完成退化的。 A.抽象产品 B产品 C创建者 D使用者

软件设计模式试题集58887

第5章设计模式 一.选择 1. 设计模式具有的优点()。 A.适应需求变化 B.程序易于理解 C.减少开发过程中的代码开发工作量 D.简化软件系统的设计 2. 设计模式一般用来解决什么样的问题( )。 A.同一问题的不同表相B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 3. 设计模式的两大主题是( )。 A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 4. 以下哪些问题通过应用设计模式不能够解决。() A)指定对象的接口B)针对接口编程 C)确定软件的功能都正确实现D)设计应支持变化 解答: 1. A 2. A 3. D 4. C 二.填空 1. 模式的基本要素包括名称、意图、问题、解决方案、参与者和协作者、()、实现、G oF参考。 2. 设计模式基本原则包括:开闭原则,(),包容变化原则。 3. 设计模式是一个( )的方案,它可以解决一类问题。 4. 1. 在设计模式群体中,效果是指()。 解答: 1. 效果 2. 从场景进行设计的原则

3. 抽象 4. 原因和结果 三.判断 1. 适配器模式属于创建型模式。 2. 在设计模式中,“效果”只是指“原因和结果”。 3. 设计模式使代码编制不能真正工程化。 4. 设计模式的两大主题是系统复用与系统扩展。 解答: 1. 错 2. 对 3. 错 4. 对 四.名词解释 1. 设计模式 2. 模板 3. 模式 4. 内聚度 解答: 1. 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性 2. 模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 3. 就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。 4. 五.简答题 1. 什么是设计模式?设计模式的目标是什么?

吉林大学2012级软件设计模式试题

2014-2015学年第1学期 2012级《软件设计模式》考试试题(开卷) 考试时间:2014年 班级学号姓名 ?本试卷满分100分; ?请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰; ?试题中使用C++语言作为描述语言,答题时可以使用C++或Java或C#程序设计语言中 的任意一种作为描述语言,但整个卷面只能使用其中一种,不得混合使用; ?请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸 一并交上来。 一、单选题(共20分,每题2分) 1.类设计中,“变化是绝对的,稳定是相对的”,下列哪个不属于这句话中“变化”的范畴? (A) 改变函数参数的类型(B) 增加新的数据成员 (C) 改变编程语言(D) 改变对象交互的过程和顺序 2.Open-Close原则的含义是一个软件实体: (A) 应当对扩展开放,对修改关闭 (B) 应当对修改开放,对扩展关闭 (C) 应当对继承开放,对修改关闭 (D) 以上都不对 3.下列关于继承表述错误的是: (A) 继承是一种通过扩展一个已有类的实现,从而获得新功能的复用方法 (B) 泛化类(超类)可以显式地捕获那些公共的属性和方法。特殊类(子类)则通过附加 属性和方法来进行实现的扩展 (C) 破坏了封装性,因为这会将父类的实现细节暴露给子类 (D) 继承本质上是“白盒复用”,对父类的修改,不会影响到子类 4.下列关于对象组合/聚合,说法错误的是: (A) 容器类能通过被包含对象的接口来对其进行访问 (B) 属于黑盒复用,封装性好,因为被包含对象的内部细节对外是不可见 (C) 可以在运行时将被包含对象改变成同类型对象,从而改变容器类的行为效果,但没有 改变容器类的接口 (D) 比继承关系更加灵活,代价是相比继承关系,增强了类间的耦合度 5.用于分离接口和具体实现,使得接口和实现可独立变化的是: (A)适配器模式(B) 桥接模式(C) 命令模式(D)模板方法模式 6.体现“集中管理多个对象间的交互过程和顺序”的是: (A)生成器模式(B) 门面模式(C) 策略模式(D)中介者模式

软件设计模式复习题

软件设计模式复习题 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) {

设计模式复习题

三、题目预测 填空题: 1.请从外观、组合、工厂方法、模板方法、观察者、单件、抽象工厂、命令、迭代器、代理、适配器模式 中选择 7 种填入下列的空缺中。 P610 1)工厂方法模式中,父类负责定义创建对象的公共接口,子类决定要创建的具体类是哪一个。 2)抽象工厂模式提供一系列相关或相互依赖对象的接口而无需指定它们具体的类。 3)单件模式确保某一个类仅有一个实例,并自行实例化并向整个系统提供这个实例。 4)组合模式将对象组合成树形结构以表示“部分 -整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。 5)外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,为子系统中的一组接口提供一个一致的界面,简化了一群类的接口。 6)观察者模式定义对象间的一种一对多的依赖关系 , 当一个对象的状态发生改变时 , 所有依赖于它的对象都得到通知并被自动更新,也就是让对象能在状态改变时被通知。 7)模板模 MVC 模型式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 8)迭代器模式在对象的集合之中游走,而不暴露集合的实现。 9)代理模式包装对象,以控制对比对象的访问。 10)适配器模式封装对象,并提供不同的接口。 2.工厂模式分为 ( 简单工厂 ),( 工厂方法 ),( 抽象工厂 ) 三种类型。 3.适配器模式,分为类的适配器和对象的适配器两种实现。其中类的适配器采用的是(继承)关系,而对 象适配器采用的是(组合聚合)关系。 4.设计模式的基本要素有(名字),(意图),(问题),(解决方案),(参与者与协作者),(实现),(一般性结构)。 5.MVC 模型的基本工作原理是基于 ( 观察者 )模式,实现是基于(命令)模式 6.面向对象的六条基本原则包括:开闭原则,里式代换原则,合成聚合原则以及(依赖倒转),(迪米特 法则)(接口隔离)。 7 .当我们想用不同的请求对客户进行参数化时,可以使用(命令)模式。

设计模式考试复习题

一、1. 设计模式一般用来解决什么样的问题: A.同一问题的不同表相 2. 下列属于面向对象基本原则的是: C.里氏代换 3. Open-Close原则的含义是一个软件实体:A.应当对扩展开放,对修改关闭. 4. 当我们想创建一个具体的对象而又不希望指定具体的类时,使用(A)模式。A.创建型 5. 要依赖于抽象不要依赖于具体。即针对接口编程不要针对实现编程:(D)依赖倒转原则 6. 依据设计模式思想,程序开发中应优先使用的是( A )关系实现复用。A, 委派 7. 设计模式的两大主题是( D ) D.系统复用与系统扩展 8. 单体模式中,两个基本要点(AB)和单体类自己提供单例A .构造函数私有 B.唯一实例 9. 下列模式中,属于行为模式的是( B ) B观察者 10. “不要和陌生人说话”是( D )原则的通俗表述 D.迪米特 1. 软件体系结构是指一个系统的有目的的设计和规划,这个设计规划既不描述活动,也不描述系统怎样开发,它只描述系统的组成元素及其相互的交互协作。 2.一个UML模型只描述了一个系统要做什么,它并没告诉我们系统是怎么做。 3.接口是可以在整个模型中反复使用的一组行为,是一个没有属性而只有方法的类。 4.多重性指的是,某个类有多个对象可以和另一个类的一对象关联。 5.当一个类的对象可以充当多种角色时,自身关联就可能发生。 6.在泛化关系中,子类可以替代父类。后前者出现的可以相同地方。反过来却不成立。 7.最通常的依赖关系是一个类操作的形构中用到了另一个类的定义。 8.组成是强类型的聚集,因为聚集中的每个部分体只能属于一个整体。 9.实现的符号和继承的符号有相似之处,两者的唯一差别是实现关系用虚线表示,继承关系用实线表示。 10. 设计模式中应优先使用对象组合而不是类继承。 1.适配器模式属于创建型模式结构型( F ) 2.在设计模式中,“效果”只是指“原因和结果”( T ) 3.设计模式使代码编制不能真正工程化( T ) 4.面向对象语言编程中的异常处理,可以理解为责任链模式(T ) 5.反模式就是反对在软件开发过程中使用设计模式分析:反模式用来解决问题的带有共性的不良方法(F ) 1.什么是设计模式?设计模式目标是什么? 答:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码可靠性。 2.设计模式中一般都遵循的原则有什么? 答:开闭原则、根据场景进行设计原则、优先组合原则、包容变化原则 3.“Gang of Four”针对“创建优秀面向对象设计”建议了哪些策略? 答:针对接口编程、优先使用对象组合而不是类继承,找到并封装变化点。 4.面向对象系统中功能复用的两种最常用技术是什么? 答:类继承和对象组合,类继承允许你根据其他类的实现来定义一个类的实现。父类的内部细节对子类可见。 类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变被复用的实现。对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。 5.只根据抽象类中定义的接口来操纵对象有什么好处? 答:1) 客户无须知道他们使用对象的特定类型,只须对象有客户所期望的接口。 2) 客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义接口的抽象类。 五、应用题(分值15) 公司架构:经理、工程师、技师和后勤人员都是公司的雇员,经理管理工程师、技师和后勤人员。高层经理领导较低级别的经理。典型层次图如下:可以使用哪种设计模式实现公司的层级关系?并说明为什么? 组合模式,第一,其公司关系架构为树形结构;第二,其表示了部分-整体关系(自己扩展)

设计模式总复习题

总复习题 复习参考资料: 1.GoF 设计模式 2.设计模式解析 3.易学设计模式 4.大话设计模式 5.深入浅出设计模式 以参考资料为主,模拟试题1-5中有些题答案在一些附加资料中 模拟试题1 一、选择题(分值20) 1. 设计模式一般用来解决什么样的问题( ) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2. 下列属于面向对象基本原则的是( ) A.继承 B.封装 C.里氏代换 D都不是 3. Open-Close原则的含义是一个软件实体( ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4. 当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用()模式。 A.创建型 B.结构型 C行为型 D.以上都可以 5. 要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( )的表述 A. 开-闭原则 B. 接口隔离原则 C. 里氏代换原则 D. 依赖倒转原则 6. 依据设计模式思想,程序开发中应优先使用的是( )关系实现复用。 A, 委派 B.继承 C创建 D.以上都不对 7. 设计模式的两大主题是( ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 8. 单体模式中,两个基本要点( )和单体类自己提供单例 A .构造函数私有 B.唯一实例 C.静态工厂方法 D.以上都不对 9. 下列模式中,属于行为模式的是( ) A.工厂模式 B观察者 C适配器以上都是 10. “不要和陌生人说话”是( )原则的通俗表述

设计模式考点

设计模式题库--自编版 选择题 1、设计模式具有()的优点。 A、提高系统性能 B、降低软件规模和复杂度 C、减少代码开发工作量 D、提升软件设计的质量 2、在面向对象软件的开发中,采用设计模式()。 A、可以减少在设计和过程中需要创建的实例对象的数量 B、可以保证程序的运行速度达到最优值 C、可以复用相似问题的相同解决方案 D、允许在非面向对象程序设计语言中使用面向对象的概念 3、()都是行为型设计模式。 A、组合模式、适配者模式和代理模式 B、观察者模式、职责链模式和策略模式 C、原型模式、建造者模式和单例模式 D、迭代器模式、命令模式和桥接模式 4.开闭原则是面向对象的可复用设计的基石,开闭原则是指一个软件实体应当对()开放,对()关闭;里氏代换原则是指任何()可以出现的地方,()一定可以出现;依赖倒置原则就是依赖于(),而不要依赖于(),或者说要针对接口编程,不要针对实现编程。 ①A、修改B、扩展C、分析D、设计 ②A、修改B、扩展C、分析D、设计

③A、变量B、常量C、基类对象D、子类对象 ④A、变量B、常量C、基类对象D、子类对象 ⑤A、程序设计语言 B、建模语言C、实现D、抽象 ⑥A、程序设计语言 B、建模语言C、实现D、抽象 5.关于单一责原则,以下叙述错误的是()。 A、一个雷只负责一个功能领域中的相应职责。 B、就一个类而言,应该有且仅有一个引起它变化的原因。 C、一个类承担的职责越多,越容易复用,被复用的可能性越大。 D、当一个类承担的职责过多时,需要将职责进行分离,将不同的职责封装 在不同的类中。 6.以下关于面向对象设计的的叙述中,错误的是()。 A、高层模块不应该依赖于低层模块。 B、抽象不应该依赖于细节。 C、细节可以依赖于抽象。 D、高层模块无法不依赖于低层模块。 7.在系统设计中应用迪米特法则,以下叙述有误的是()。 A、在类的划上,一个尽量创建松耦合的类,类的耦合度越低,复用越容易。 B、如果两个类之间不必彼此直接通信,那么这两个类就不应该发生直接的 相互作用。 C、在对其他类的引用上,一个对象对其他对象的引用应该降到最低。 D、在类的设计上,只要有可能,一个类型应该尽量设计成抽象类或接口,且成员变量和成员函数的访问权限最好设置为公开的。

设计模式习题及参考答案

《设计模式》复习题 一、单选题 1.不同级别的用户对同一对象拥有不同的访问权利或某个客户端不能直接操作到某 个对象,但又必须和那个对象有所互动,这种情况最好使用什么设计模式( ) A. Bridge模式 B. Facade模式 C. Adapter模式 D. Proxy模式 2.模式常用的基本设计模式可分为( ) A.创建型、结构型和行为型 B.对象型、结构型和行为型 C.过程型、结构型和行为型 D.抽象型、接口型和实现型 3.以下哪个模式是利用一个对象,快速地生成一批对象( ) A. 抽象工厂(Abstract Factory)模式 B. 合成(Composite)模式 C. 原型(Prototype)模式 D. 桥接(Bridge)模式 4.以下不属于结构型模式是( ) A. COMPOSITE(组合) B. ADAPTER(适配器) C. FLYWEIGHT(享元) D. SINGLETON(单例) 5.以下意图那个是用来描述ABSTRACT FACTORY(抽象工厂)模式( ) 。 A.提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 B.定义一个用于创建对象的接口,让子类决定实例化哪一个类。 C.将一个类的接口转换成客户希望的另外一个接口。 D.表示一个作用于某对象结构中的各元素的操作。 6.设计模式的两大主题是( ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展

7.外观模式的作用是() A.当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功 能。 B.为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更 加容易使用。 C.保证一个类仅有一个实例,并提供一个访问他的全局访问点。 D.在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现 某软件公司欲设计一款图像处理软件,帮助用户对拍摄的照片进行后期处理。在软件需求分析阶段,公司的系统分析师识别出了如下3个关键需求: 图像处理软件需要记录用户在处理照片时所有动作,并能够支持用户动作的撤销与重做等行为。 图像处理软件需要根据当前正在处理的照片的不同特征选择合适的处理操作,处理操作与照片特征之间具有较为复杂的逻辑关系。 图像处理软件需要封装各种图像处理算法,用户能够根据需要灵活选择合适的处理算法;软件还要支持高级用户根据一定的规则添加自定义处理算法。 在系统设计阶段,公司的架构师决定采用设计模式满足上述关键需求中对系统灵活性与扩展性的要求。具体来说,为了支持灵活的撤销与重做等行为,采用()最为合适;为了封装图像操作与照片特征之间的复杂逻辑关系,采用()最为合适;为了实现图像处理算法的灵活选择与替换,采用()最为合适。 8. A.工厂模式B.责任链模式C.中介者模式D.命令模式 9. A.状态模式B.适配器模式C.组合模式 D.单例模式 10. A.模板方法模式B.访问者模式C.策略模式D.观察者模式11不同级别的用户对同一对象拥有不同的访问权利或某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动,这种情况最好使用什么设计模式( ) A. Bridge模式 B. Facade模式 C. Adapter模式 D. Proxy模式 12设计模式一般用来解决什么样的问题( )

软件设计模式终极版复习题

1.简述“开—闭”原则的基本思想。请举出一个使用了软件“开—闭”原则的软件设计模式,其中何处体现了“开—闭”原则。 答:“开—闭”原则:软件实体应当对扩展开放,而对修改关闭,“开-闭”原则要求软件系统能够在不需要修改原有类的基础上,通过增加类达到扩展功能的目的。 Abstract factory体现了这个原则,如果想增加一类新的products,只需在product类体系中增加各个products,然后在factory类体系结构中增加一个concrete factory就可以了,而不需要对现有类做任何修改,The Open-closed principle[ocp]在不改动过模块源代码的情况下扩展模块的行为。 软件实体(类模块函数等)应该是可以扩展的,但是不可以修改的。 2.简述依赖例转原则的基本思想。请举出一个使用了软件依赖原则的软件设计模式,其中何处体现了依赖原则。 答:依赖倒置原则的基本思想是:①高层模块不应该依赖于低层模块,二者都应该依赖于抽象。②抽象不应该依赖于细节,细节应该不依赖于抽象。Tomplate method就体现了这个原则,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,template method使得子类不改变一个算法的结构,即可重定义该算法的某些特定步骤。 3.什么是单一职责原则?请举出一个使用了单一职责原则的软件设计模式,其中何处体现了单一职责原则。 答:基本思想:SRP使得一个类或一个模块承担的责任尽可能的少,使尽可能少的因素或动机影响该类或该模块,即增大类或模块的内聚性,减少其耦合度,SRP 是所有原则中最简单的之一,也是最难正确运用的之一。 COMMAND模式体现了SRP原则,大多数类都是一组方法和相应的一组变量的结合,而该模式只是封装了一个没有任何变量的函数,它对函数的关注超过了类,将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化。 4.软件复用可采用类的继承方式和类的聚合方式,比较两者的优缺点。 答:聚合:一个对象拥有另一个对象或对另一个对象负责(即一个对象包含另一个对象或是另一个对象的一部分)并且聚合对象和其所有具有相同的生命周期(即所谓的“同生共死”关系)。 聚合复用优点:①容器类仅能通过被包含对象的接口来对其进行访问。②“黑盒”复用,因为被包含对象的内部细节对外是不可见。③包装性好。④实现上的相互依赖性比较小。⑤每一个类只专注于一项任务。⑥通过获取指定其他的具有相同类型的对象的使用,可以在运行期间动态地定义(对象的)组合。 聚合的缺点:①导致系统中的对象过多②为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义。 类继承:是一种通过扩展(一个已有对象的)实现,从而获得新功能的复用方法。继承的优点:①容易进行新的实现,因为其大多数可继承而来②易于修改或扩展那些被复用的实现。 继承的缺点:①破坏了封装性,因为这会将父类的实现细节暴露给子类②“白盒”复用,因为父类的内部细节对于子类而言通常是可见的③当父类的实现更

设计模式考试复习题含答案

一、1. 设计模式一般用来解决什么样的问题:A.同一问题的不同表相 2. 下列属于面向对象基本原则的是:C.里氏代换 3. Open-Close原则的含义是一个软件实体:A.应当对扩展开放,对修改关闭. 4. 当我们想创建一个具体的对象而又不希望指定具体的类时,使用(A)模式。A.创建型 5. 要依赖于抽象不要依赖于具体。即针对接口编程不要针对实现编程:(D)依赖倒转原则 6. 依据设计模式思想,程序开发中应优先使用的是( A )关系实现复用。A, 委派 7. 设计模式的两大主题是( D ) D.系统复用与系统扩展 8. 单体模式中,两个基本要点(AB)和单体类自己提供单例A .构造函数私有 B.唯一实例 9. 下列模式中,属于行为模式的是( B ) B观察者 10. “不要和陌生人说话”是( D )原则的通俗表述 D.迪米特 1. 软件体系结构是指一个系统的有目的的设计和规划,这个设计规划既不描述活动,也不描述系统怎样开发,它只描述系统的组成元素及其相互的交互协作。 2.一个UML模型只描述了一个系统要做什么,它并没告诉我们系统是怎么做。 3.接口是可以在整个模型中反复使用的一组行为,是一个没有属性而只有方法的类。 4.多重性指的是,某个类有多个对象可以和另一个类的一对象关联。 5.当一个类的对象可以充当多种角色时,自身关联就可能发生。 6.在泛化关系中,子类可以替代父类。后前者出现的可以相同地方。反过来却不成立。 7.最通常的依赖关系是一个类操作的形构中用到了另一个类的定义。 8.组成是强类型的聚集,因为聚集中的每个部分体只能属于一个整体。 9.实现的符号和继承的符号有相似之处,两者的唯一差别是实现关系用虚线表示,继承关系用实线表示。 10. 设计模式中应优先使用对象组合而不是类继承。 1.适配器模式属于创建型模式结构型(F ) 2.在设计模式中,“效果”只是指“原因和结果”(T ) 3.设计模式使代码编制不能真正工程化(T ) 4.面向对象语言编程中的异常处理,可以理解为责任链模式(T ) 5.反模式就是反对在软件开发过程中使用设计模式分析:反模式用来解决问题的带有共性的不良方法(F ) 1.什么是设计模式?设计模式目标是什么? 答:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码可靠性。 2.设计模式中一般都遵循的原则有什么? 答:开闭原则、根据场景进行设计原则、优先组合原则、包容变化原则 3.“Gang of Four”针对“创建优秀面向对象设计”建议了哪些策略? 答:针对接口编程、优先使用对象组合而不是类继承,找到并封装变化点。 4.面向对象系统中功能复用的两种最常用技术是什么? 答:类继承和对象组合,类继承允许你根据其他类的实现来定义一个类的实现。父类的部细节对子类可见。类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变被复用的实现。对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。 5.只根据抽象类中定义的接口来操纵对象有什么好处? 答:1)客户无须知道他们使用对象的特定类型,只须对象有客户所期望的接口。 2)客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义接口的抽象类。 五、应用题(分值15) 公司架构:经理、工程师、技师和后勤人员都是公司的雇员,经理管理工程师、技师和后勤人员。高层经理领导较低级别的经理。典型层次图如下:可以使用哪种设计模式实现公司的层级关系?并说明为什么?

相关文档