例题1
以下哪种设计模式可以动态地给对象增加扩展功能,为扩展功能提供了子类化的灵活替代方案()
A 责任链模式
B 适配器模式
C 装饰器模式
D 组合模式
解析
- 责任链模式:这种模式将多个对象串成链条,每个对象都可能处理请求,或者将请求传递给下一个对象。这种模式并不会动态地增加功能,而是用于处理请求的职责分配。
- 适配器模式:适配器模式的主要目的是将一个类的接口转换为客户端期望的另一个接口,不涉及动态增加功能。
- 装饰器模式:装饰器模式允许动态地给对象增加额外的功能,而且不会影响到其他对象,是对继承(子类化)的一种更灵活的替代方案。它通过将对象包装在装饰器中,来增强对象的功能。装饰器模式正是题目中提到的那种模式。
- 组合模式:组合模式是一种将对象组合成树形结构的模式,目的是让客户端可以以一致的方式对待单个对象和对象的组合。它并不用于动态增加功能。
例题1
下面代码使用了哪种设计模式()
interface AbstractProductA {
void operationA();
}
class ConcreteProductA1 implements AbstractProductA {
public void operationA() {
System.out.println("ConcreteProductA1 operationA");
}
}
class ConcreteProductA2 implements AbstractProductA {
public void operationA() {
System.out.println("ConcreteProductA2 operationA");
}
}
interface AbstractProductB {
void operationB();
}
class ConcreteProductB1 implements AbstractProductB {
public void operationB() {
System.out.println("ConcreteProductB1 operationB");
}
}
class ConcreteProductB2 implements AbstractProductB {
public void operationB() {
System.out.println("ConcreteProductB2 operationB");
}
}
interface AbstractFact {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
class ConcreteFact1 implements AbstractFact {
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
class ConcreteFact2 implements AbstractFact {
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
A 工厂方法模式
B 建造者模式
C 抽象工厂模式
D 适配器模式
解析
从代码结构来看,代码展示了一个包含多个产品族(ProductA
和 ProductB
)的工厂系统,且每个工厂(ConcreteFact1
和 ConcreteFact2
)都可以生成多个具体产品(ConcreteProductA1
, ConcreteProductA2
, ConcreteProductB1
, ConcreteProductB2
),因此,这段代码使用的设计模式是抽象工厂模式。
-
抽象工厂模式(Abstract Factory Pattern):
- 抽象工厂模式提供一个接口,创建一系列相关或依赖的对象,而无需指定具体的类。
- 在这段代码中,
AbstractFact
是抽象工厂接口,定义了创建AbstractProductA
和AbstractProductB
的方法。 ConcreteFact1
和ConcreteFact2
是具体工厂类,它们分别创建ConcreteProductA1
,ConcreteProductB1
和ConcreteProductA2
,ConcreteProductB2
等具体产品。- 这种设计模式适合用于产品族的场景,确保产品族之间的兼容性。
-
A. 工厂方法模式:工厂方法模式是指定义一个接口用于创建对象,但允许子类决定要实例化的具体类。这段代码不仅涉及到单个产品的创建,还涉及到多个产品族的创建,所以它不是单一的工厂方法模式。
-
B. 建造者模式:建造者模式通常用于一步一步构建一个复杂对象,不是用于创建一系列相关产品族。
-
D. 适配器模式:适配器模式的目的是将不同接口转换成客户端期望的接口,不涉及创建对象,因此不符合这段代码的场景。
例题3
模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。下列说法不正确的是()
A 模板方法模式能提高系统的复用性,符合开闭原则
B servlet中的Httprequest的doGet和doPost方法使用了模板方法模式
C 模板方法模式不会增加类的数目
D 模板方法模式的一个缺点是,如果父类添加新的抽象方法,所有子类都要改一遍
解析
这道题目是关于模板方法模式的考察。模板方法模式允许在不改变算法整体结构的情况下,子类重新定义某些步骤。我们逐个分析选项,找到不正确的说法:
选项解析:
模板方法模式的优缺点是:
优点:1、提高复用性,2、提高扩展性,3、符合开闭原则
缺点:1、类数目增加,2、增加了系统实现的复杂度,3、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
-
A 模板方法模式通过定义通用算法骨架,让子类覆盖特定步骤,避免重复代码,提高了复用性,并且符合开闭原则(对扩展开放,对修改封闭)。
-
B 在 Java Web 开发中,
HttpServlet
类的doGet
和doPost
方法是模板方法模式的典型应用。HttpServlet
提供了一个通用的服务方法service()
,并由子类实现具体的doGet()
或doPost()
,符合模板方法模式的定义。 -
C 模板方法模式通常会增加类的数目。因为模板方法一般是在父类中定义的,而子类需要扩展父类,可能会有多个子类进行具体实现,可能导致类的数量增加。
-
D 这是模板方法模式的一个典型缺点。如果父类中定义了新的抽象方法,那么所有的子类都必须实现该方法,会导致大量修改。
补充
设计模式
设计模式总共有 23 种经典模式,它们可以分为创建型模式、结构型模式和行为型模式三类。
创建型模式:
- 工厂方法模式
工厂方法就是让子类决定实例化哪一个类,用工厂封装创建对象的细节。 - 抽象工厂模式
抽象工厂就是提供一个接口,用来创建一系列相关或互相依赖的对象,而不需要知道具体类。 - 单例模式
单例模式确保一个类只有一个实例,并提供全局访问点来获取这个实例。 - 建造者模式
建造者模式是一步步构建一个复杂对象,各个部分独立创建,最后组合在一起。 - 原型模式
原型模式就是通过复制已有的对象(克隆)来创建新的实例,而不是通过实例化。
结构型模式:
- 适配器模式
适配器就是让两个不兼容的类能够协同工作,解决接口不匹配的问题。 - 桥接模式
桥接模式是把抽象部分和实现部分分离,允许它们独立变化,解决多维度变化的复杂问题。 - 组合模式
组合模式让你能够把对象组合成树形结构来表示“整体-部分”关系,客户端可以统一处理个体对象和组合对象。 - 装饰器模式
装饰器模式就是在不改变原始类的前提下,动态地为对象增加新的功能,灵活替代子类化。 - 外观模式
外观模式提供了一个简化的接口,让复杂系统更容易使用。 - 享元模式
享元模式通过共享大量细粒度对象,减少内存消耗,用来优化性能。 - 代理模式
代理模式就是用一个对象控制对另一个对象的访问,常用于访问控制和延迟加载。
行为型模式:
- 模板方法模式
模板方法定义了算法的骨架,把某些步骤延迟到子类中实现,避免重复代码。 - 命令模式
命令模式把请求封装成对象,允许将请求的发送者和接收者解耦,方便实现撤销、重做等功能。 - 责任链模式
责任链模式就是将多个对象用链条串联起来,每个对象可以处理请求,或者将请求传递给下一个对象。 - 迭代器模式
迭代器模式就是提供一种方法顺序访问集合对象中的元素,而不用暴露内部细节。 - 中介者模式
中介者模式通过一个中介对象,来让各个对象之间的通信和协调集中化,减少对象之间的耦合。 - 备忘录模式
备忘录模式允许在不破坏封装的前提下,捕获并保存对象的内部状态,以便将来恢复。 - 观察者模式
观察者模式是指多个对象监听一个对象,当该对象状态发生变化时,会通知所有监听者更新。 - 状态模式
状态模式通过将状态逻辑分离到不同的状态类中,允许对象在其内部状态改变时,行为也随之改变。 - 策略模式
策略模式允许定义一系列算法,把每个算法封装起来,并且可以互相替换,避免使用条件语句。 - 访问者模式
访问者模式是用来分离对象的数据结构和数据操作,允许在不改变对象结构的前提下定义新的操作。 - 解释器模式
解释器模式为特定的语言定义了语法规则,并设计一个解释器来解释该语言的句子或表达式。