设计模式

Posted by serrini on February 18, 2020

单选题

  • 开发与新硬件交互的软件,并急于根据实际硬件进行测试。硬件制造商说设备驱动程序的接口可能会在后续日期发生变化。设备驱动程序会在整个代码中到处使用,如果担心后期这些接口发生修改会带来很大的风险,采用哪个设计模式?
    • Bridge
    • Strategy
    • Mediator
    • ==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