OOAD与设计模式练习题

时间:2023-02-24 10:46:29
1、在系统的整合中,模块A中有一个类
public class Action{
public void run(){
System.out.println("action run");
}
}
在模块B中有一个接口
public interface Work{
public void doStart();
public void doRun();
public void doEnd();
}


在模块C中有一个方法
public void go(Work work){
work.doRun();
}


Action中的run方法正好适用于Work接口中doRun方法的实现,但是Action和Work又是俩个不兼容的类型,我们还要遵守OCP原则,只能扩展源代码又不能修改源代码,那么这个时候我们应该用怎么的代码来解决这个问题。
(适配器)




2、系统中有一个类Person,该类从系统中的一个接口中实现了一个方法 public void say(String name);该方法可以打印 "hello "+name ,现在需要动态的增加Person类中say方法功能,比如在打印出名字之前在名字前面加上一个前缀"briup_",还有在say方法打印名字之后记录一下当前打印的时间。同时这俩个新功能还是可以根据用户的要求动态的添加到say方法上的。
(装饰模式)




3、假设一个系统中有三个简单角色,"游客","会员","管理员",当用一个用户User进行查看其它用户信息功能showUsersInfo的时候,但是只有管理员才能有权限使用这个功能,所以我们需要使用动态代理的方式产生代理对象,从而在可以showUsersInfo方法执行执行先看看用户是否是管理员的角色,如果是则让他查看,如果不是则不让查看
(代理模式,使用静态代理就可以)


4、如果系统中的模块A、模块B、模块C里面有不同的方法,现在用户使用的时候需要不停的切换不同的对象来调用其对应的方法完成相应的功能,那么怎么设计能解决这个问题,用简单的代码进行实现
(门面模式)




5、文件系统和我们在例子中说到的树状结构很类似,那么在代码中使用组合模式,简单的设计一下一个文件系统(主要包括:根目录 文件夹 文件这三种)
(组合模式)


6、使用观察者模式完成以下功能:当孩子生病的时候,孩子的父亲和母亲分别做出相应的处理
(观察者模式)






7、一个人九宫格里面,只能前进一步,原地左转,原地右转,那么如果这个人随机发出几个动作之后,那么这个人是否会死亡(越过九宫格范围则视为死亡),如果没有死亡那么这个人现在的位置是哪里。使用状态模式来完成代码
(状态模式)
person:forward
与状态相关(面向)
north:x--;west,east
south:x++;east,west
west:y--;...,...
east:y++;...,...


location{
int x,y
addX,addY
reX,reY
isAlive(){
(x ||x  ||y  ||y )
}
}


state{
left =
right =
forword()
turnLeft()
...
}
NorthState{
left =
right =
forword()
turnLeft()
...
}


psrson{


Location location
State state


forawrd(){
state.forward();
if(){


}
}
turnLeft(){
state =
}
turnRight()
}










8、有一个字符串,要依次经过几个过滤器层层过滤后再次能输出,第一个是几个固定的敏感词语不能出现比如反动分子、*等等,第二是和系统相关的词语不能出现例如管理员、系统等,第三是文字不能太长,否则就裁剪到超过的长度部分。使用责任链模式来实现
(责任链模式)


9、自己写一个类Car,要求Car的对象是单例,同时分别使用不同版本的单例模式来实现,并描述一下每种情况的特点
(单例模式)