2018
- 请写出与状态模式有关的OO原则(至少三个)
设计原则:
1、开闭原则(Open Close Principle)对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码。要达到这样的效果,我们需要使用接口和抽象类。
2、里氏代换原则(Liskov Substitution Principle)
子类能够代替父类而起同样的作用。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而父类与子类的继承关系就是抽象化的具体实现。
3、依赖倒转原则(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体。依赖倒转原则是开闭原则的基础。
4、接口隔离原则(Interface Segregation Principle)
客户端不应该依赖那些它不需要的接口。降低依赖,降低耦合。
5、迪米特法则(Demeter Principle)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
7、单一职责原则:一个类应该只有一个引起变化的原因。
8、好莱坞原则:允许底层组件挂钩到系统上,但高层组件会决定什么时候和怎样使用它们,即”别调用我们,我们会调用你”。
- how are design patterns different from class libriaies?设计模式与类库有何不同?
设计模式,是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
类库(Class Library)是面向对象可重用类型的集合,这些类型包括:接口、抽象类和具体类。类库可以解决一系列常见编程任务(包括诸如字符串管理、数据库连接等),还可以解决专用开发任务(桌面应用程序、WEB应用程序等)。
- Write a class “LowercaseInputStream” which is a Java I/o decoratorthat converts all uppercase characters to lowercase in the input stream.In otherwords, if we read in “I know the Decorator Pattern therefore i RULE!” then your decorator converts this to “i know the decorator pattern therefore i rule!”
- What is a MacroCommand in the Command Pattern? Please write codes for a general MacroCommand class.什么是命令模式中的宏命令?请为通用宏命令类编写代码。
宏命令(mecro command)是多个命令组合在一起的命令,又称为组合命令,它是命令模式和组合模式的产物。宏命令是一个具体命令,包含了对其他对象的引用,在调用宏命令的execute()时,它会调用其成员的execute(),一个宏命令的成员对象可以是简单命令,也可以是宏命令。
- Please compare the intents of patterns of Adapter,facade and Decorator.请对比一下适配器、外观、装饰三种图案的用意。
适配器:将接口转换为客户希望的另外一个接口。满足has-a关系,注重兼容、转换。
外观:向系统添加一个接口,来隐藏系统的复杂性。注重让接口更简单。
装饰器:在不改变一个对象的基础上,动态地添加一些功能。满足is-a关系,注重扩展。
适配器和装饰器符合OCP,外观不符合。
- Please compare Strategy and State Patterns.
① 策略模式是定义一系列算法,将他们封装起来,并且相互之间可以替换。状态模式是允许一个对象状态改变时改变它的行为。
② 策略模式符合OCP,算法可以自由切换。状态模式对OCP支持不太好,如果是状态可以切换的状态模式,那么新增状态需要修改切换状态的源代码。
③ 策略模式中,客户端知道所有策略类,策略类是暴露的。状态模式中,客户端不知道内部如何变化,封装变化,暴露行为。
④ 两者的环境类Context不同。策略模式只负责委托行为,即算法替换。状态模式不仅负责委托行为,还负责登记状态变化。
状态模式比策略模式更复杂一些。
⑤ 相同点:扩展性好,可以方便的新增算法/状态。都可以代替条件语句。都会增加类的个数,使系统复杂。
- 建造者模式使用场景
- Please explain how design patterns contribute to the Mode-View-Controller?
模型:包括所有的数据、状态和程序逻辑。
视图:负责数据的可视化。
控制:控制数据流向模型,并在数据变化时更新视图。
模型、视图、控制各自独立和模块化,层次分明,复用性好,方便维护。
MVC是一种架构模式,设计模式相比于MVC更抽象,是比架构模式更小的元素,一个架构模式中可以包含多个设计模式。架构模式适用于特定领域,而设计模式适用于各种应用。
框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间。可以说,框架是软件,而设计模式是软件的知识。
- You are required to develop a cross-platform video-player. It can play videos in various formats including MPEG,RMVB,AVI, WMV,on multiple operatingsystem platforms (such as Windows,Linux, Unix,etc.). which design pattern shouldyou use? Please draw the class diagram of the video-player.
- 写一个双向适配器的代码,画出类图,以cat会捉老鼠,dog会bark为例,实现cat catch, dog bark
- 设置一个oa系统,公司需要向部门全体员工或个人发送消息
我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo 类使用 Employee 类来添加部门层次结构,并打印所有员工。
创建 Employee 类,该类带有 Employee 对象的列表。
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
//构造函数
public Employee(String name,String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates(){
return subordinates;
}
public String toString(){
return ("Employee :[ Name : "+ name
+", dept : "+ dept + ", salary :"
+ salary+" ]");
}
}
使用 Employee 类来创建和打印员工的层次结构。
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO = new Employee("John","CEO", 30000);
Employee headSales = new Employee("Robert","Head Sales", 20000);
Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
Employee clerk1 = new Employee("Laura","Marketing", 10000);
Employee clerk2 = new Employee("Bob","Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//打印该组织的所有员工
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
2019
- 请写出与工厂方法模式有关的OO原则(至少三个)
- 什么是设计模式?什么是design pattern catalog?(原题就是这么写的)
- 观察者模式中的update方法是否必须?请说明理由。
必须。update方法的作用是使Observer在得到主题的通知时更新自己。如果没有update,要实现通知更新就要不停的调用接口,等于没有用到观察者模式。并且,如果没有update,如果有多个不同观察者,就要在主题类中写多个不同的notify去调用;如果观察者观察多个主题,就不知道数据来自哪个主题了。
- 比较策略模式和状态模式。
- 比较适配器模式、外观模式、装饰者模式的意图。
- 比较透明组合和安全组合。
透明组合模式中,抽象构件Component中声明了所有用于管理成员对象的方法,确保所有的构件类都有相同的接口。在客户端看来,叶子对象与容器对象所提供的方法是一致的。
透明组合模式的缺点是不够安全,因为Leaf和Composite在本质上是有区别的。叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此为其提供add()、remove()以及getChild()等方法是没有意义的,这在编译阶段不会出错,但在运行阶段如果调用这些方法可能会出错。
安全组合模式中,在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法。这种做法是安全的。
安全组合模式的缺点是不够透明,客户端必须有区别地对待叶子构件和容器构件。在实际应用中,安全组合模式的使用频率也非常高,在Java AWT中使用的组合模式就是安全组合模式。
- 桥接模式中,如何实现从实现中抽象解耦?
- 享元模式如何实现对象复用而不是完全相同?
- 圣诞节快到了,我们需要生产礼物,要确保礼物是能适合所有年龄段的,并且礼物中给出了建议的年龄段,请问要用什么设计模式来实现,并解释。
- 第一题是书上装饰者模式的例子,要求画出类图,写出代码,把书上例子看懂没问题。
- 写出一个多例模式
多例模式的关键点在于
- 通过实例容器保存容器
- 利用私有构造器阻止外部构造
- 提供
getInstance()
方法获取实例
多例模式的特点
- 可以有多个实例
自己创建并管理自己的实例,向外界提供自己的实例
/**
* 多例模式
* 以围棋只有黑白两种棋子为例
*/
public class MultiplePattern {
//必须要有容器
private static List<Chess> chessList = new ArrayList<>();
private static final Chess white = new Chess("white");
private static final Chess black = new Chess("black");
private static final int maxCount = 2;
static {
chessList.add(white);
chessList.add(black);
}
//私有构造方法,避免外部创建实例
private MultiplePattern() {
}
//随机拿取棋子
public static Chess getInstance() {
Random random = new Random();
int crt = random.nextInt(maxCount);
return chessList.get(crt);
}
//指定拿取棋子
public static Chess getInstance(int index) {
return chessList.get(index);
}
}
2017
- 请写出与策略模式有关的OO原则(至少三个)
- [10 marks] Why does the update method in the Observer interface in some cases include a reference to the object being observered? Doen’t the observer know what object it is observing?为什么观察者接口中的update方法在某些情况下包含对被观察对象的引用?难道观察者不知道它在观察什么物体吗?
- how are design patterns different from class libriaies?设计模式与类库有何不同?
- 设计模式与数据结构与算法有何不同?
[25 mars] There is a coffee shop serves BouseSilond and Espreso coffee. All coffee can be served with coordinate of Milk and Mocha. Use Decorator Pattern to construst the coffee shop program that compute every beverages cost with its discription.
class beverage{
String description;
String getDescription(){return description;}
double cost;
}
Draw the pattern class diagram , and full code (class CondimentDecorator, HausaBlend,Espresso,Milk, Mocha, StarBuckCoffee and other classes required) to construct the program includng a test drive (StarBuzzcoffee class).
[25 marks] You are required to develop a cross-plattorm video-player. it can playvideos in various formats including MPEG,RMAB,AVI, WVM on multiple operating system platforms (such as Windows,Unix,Linux ,etc.).Which design pattern will you use? Please draw the class dliagram of the video-player.