单选题
- 开发与新硬件交互的软件,并急于根据实际硬件进行测试。硬件制造商说设备驱动程序的接口可能会在后续日期发生变化。设备驱动程序会在整个代码中到处使用,如果担心后期这些接口发生修改会带来很大的风险,采用哪个设计模式?
BridgeStrategyMediator- ==Adapter==
Decorator- 适配器模式所针对的就是接口兼容和变化问题
- 下面哪个模式很好的体现了“组合优于继承的”面向对象设计原则?
- ==Adapter==
- “组合优于继承”针对的是复用,composite、decorator使用组合是为了组织复合结构,bridge是为了匹配接口和实现
- Factory Method完全没有使用组合关系,只是普通关联
- Adapter的目的是复用Adaptee,采用了组合的方式,而不是直接继承Adatee
- “隐藏类的构造函数,并提供静态方法代替构造函数的作用,这样客户就可以在不知道对象如何被构造的情况下使用对象”
- 只有Singleton会使用隐藏构造函数,代之以静态方法
- 建立日志是对象创建功能,只有Singleton和Abstract Factory合适。但抽象工厂适用场景是建立产品组合,单件模式是控制构造对象数量不超过1。
- 遍历一些学生,应该使用Iterator模式
简答题
什么是迭代器? Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。
现在对武器的使用有约定:Queen使用Knife,Troll使用BowAndArrow,King使用Sword,Knight使用Axe,setWeapon方法应该如何处理,给出实现方案
在setWeapon()方法中加一个检查方法,如果为false,返回异常
void setWeapon(WeaponBehavior w) throws Exception{
if isValid(w){
this.weapon = w;
}else{
throw new Exception("weapontype error");
}
}
abstract boolean isValid(WeaponBehavior w){}
boolean isValid(WeaponBehavior w)::Queen{
if(w instanceof KnifeWeaponBehavior){
//instance关键字判断一个对象是否是某个类型的实例
return true;
}else{
return false;
}
}
图片编辑系统,图书有五种格式,每一种的保存方法都不一样,因此Image实现了五种方法,使用设计模式修改
策略模式
抽象出一个«interface»为ImageSaver,拥有一个公共方法save(image),分别用class JpegSaver, class BmpSaver, class TiffSaver实现该接口,Image类use a IamgeSaver。
是为了扩展更多的行为而使用策略模式
Image使用CreateThumbnail方法动态创建了Thumbnail,是典型的抽象工厂模式
public class FactoryChoice{
static public IChoice getChoiceObj(string cChoice){
IChoice objChoice = null;
if(cChoice == "car"){
objChoice = new Car();
}else if(cChoice == "bike"){
objChoice = new Bike();
}else{
objChoice = new InvalidChoice();
}
return objChoice;
}
}
public class Store{
public void purchase(){
string choice = getUserChoice(); //获取用户的选择
IChoice ichoice = FactoryChoice.getChoiceObj(choice);
ichoice.buy();
}
}
FactoryChoice使用getChoiceObj方法动态创建了IChoice