论坛首页 招聘求职论坛

今天面试家公司,说是一个星期内有回复

浏览 24935 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-29  
有点像baidu的题目,面试题目跟过程都像baidu的风格, map的原理那里特别像
0 请登录后投票
   发表时间:2011-12-29  
好多答不上,学习ing
0 请登录后投票
   发表时间:2011-12-29  

第五题,给个实现,用的工厂方法,欢迎高手拍砖,说策略模式的同学来探讨下。

大致思路是,有一个抽象类ArrayHandler,定义process方法处理List里面的数组。分别有IntArrayHandler,StringArrayHandler以及其他继承ArrayHandler。

ArrayHandlerFactory是Handler的工厂,createHandler方法根据数组的类型返回不同的Handler

Client为调用工厂方法的类。代码如下

ArrayHandler

package zuoshu.pattern.q1;

public abstract class ArrayHandler {
	Object mArray;//用Object而不用Object[]是因为输入数组可能是int[]
	//用抽象类而不用接口是因为要有构造函数来接收输入的数组
	public ArrayHandler(Object array){
		mArray = array;
	}
	public abstract void process();//处理数组的方法
}

 ArrayHandlerFactory

package zuoshu.pattern.q1;

public class ArrayHandlerFactory {
	public static ArrayHandler createHandler(Object array) {
		Class c = array.getClass();
		//int[]
		if (c.equals(int[].class)) {
			return new IntArrayHandler(array);
		} 
		//String[]
		else if (c.equals(String[].class)) {
			return new StringArrayHandler(array);
		}
		//unimplement
		else {
			return new UnsupportArrayHandler(array);
		}
	}
}

 IntArrayHandler

package zuoshu.pattern.q1;

public class IntArrayHandler extends ArrayHandler {
	public IntArrayHandler(Object array) {
		super(array);
	}
	@Override
	public void process() {
		System.out.println("processing int[]");
	}

}

 StringArrayHandler

package zuoshu.pattern.q1;

public class StringArrayHandler extends ArrayHandler {
	public StringArrayHandler(Object array) {
		super(array);
	}

	@Override
	public void process() {
		System.out.println("processing String[]");
	}

}

 UnsupportArrayHandler

package zuoshu.pattern.q1;

public class UnsupportArrayHandler extends ArrayHandler {

	public UnsupportArrayHandler(Object array) {
		super(array);
	}

	@Override
	public void process() {
		System.out.println("unimplemented array handler:" + mArray.getClass());
	}

}

 客户端调用方法如下

package zuoshu.pattern.q1;

import java.util.List;

public class Client {
	public void doTask(List<Object> list) {
		ArrayHandler handler;
		for (Object o : list) {
			handler = ArrayHandlerFactory.createHandler(o);
			handler.process();
		}
	}
}

 写了个测试如下

package zuoshu.pattern.q1;

import java.util.ArrayList;
import java.util.List;

public class Q1 {
	public static void main(String[] args) {
		Integer[] intArray = new Integer[5];
		String[] stringArray = new String[5];
		Object[] objArray = new Object[5];
		List<Object> list = new ArrayList<Object>();
		list.add(intArray);
		list.add(stringArray);
		list.add(objArray);
		Client c = new Client();
		c.doTask(list);
	}
}

 输出如下

processing int[]
processing String[]
unimplemented array handler:class [Ljava.lang.Object;

 

欢迎高手讨论

0 请登录后投票
   发表时间:2011-12-29   最后修改:2011-12-29
zuoshu 写道
backshadow 写道
1、int[10], 值为进入的次序
2、考得是Spring事务源码
3、线程池啊,阻塞啊,reanctor模式等
5、策略模式
7、参考ReentrantReadWriteLock 和 Semaphore
我觉得这些题目挺好的,什么公司,我能去试试吗?

阿?5用抽象工厂可以吗?

泛型+简单工厂+策略;
你说的"抽象工厂" 其实是 工厂模式,也可以的;
大话设计模式开头讲得就是这个;
0 请登录后投票
   发表时间:2011-12-29  
悲剧 刚毕业半年 只有 5 6 8会 其他表示好大压力 第一题跟不看不懂啥意思
0 请登录后投票
   发表时间:2011-12-29  
7、现系统有主数据库一个,支持保存修改查询,四个从数据库只查询。主从数据库无须考虑数据同步,当成数据一致;现在实现让service方法中根据方法名(说明数据库操作类型),分配数据主从数据库连接。让调用者(开发人员)不关心具体使用的哪个数据库!

这个是读写分离啊,我在基于Spring的基础上做过,spring解决方案是,其提供了一个数据路由的功能,继承他的类实现他的方法就完了
1 需要继承实现的抽象类
/**
 * 描述: 动态数据代理路由
 * @author Hd
 *
 */
public class DbSourceMap extends AbstractRoutingDataSource {

	

	@Override
	protected Object determineCurrentLookupKey() {
		return DbSourceHolder.getDbSource();
	}

}


2 用来做切换的实现
/**
 * 描述:   动态数据代理切换类
 * @author Hd
 *
 */
public class DbSourceHolder {
	  private static final ThreadLocal contextHolder = new ThreadLocal();  

	    public static void setDbSource(String  dbid) {  
	        contextHolder.set(dbid);  
	    }  
	      
	    public static String getDbSource() {  
	        return (String) contextHolder.get();  
	    }  
	      
	    public static void clearDbSource() {  
	        contextHolder.remove();  
	    }    
}



然后spring 配置文件
	<bean id="multiJdbcDataSourceMap" class="com.xxxxxxx.base.dbsource.DbSourceMap">
	<property name="targetDataSources">
	 <map key-type="java.lang.String" >
	 <entry key="ds1" value-ref="dataSource1"  />
	 <entry key="ds2" value-ref="dataSource2"  />
	 </map>
	</property>
	 <property name="defaultTargetDataSource" ref="dataSource1"/>  
	</bean>


现在实现的功能就是调用DbSourceHolder 类的方法 可以随时切换库 让调用者(开发人员)不关心具体使用的哪个数据库! 实现这个很简单的用Spring 的AOP就可以了 在service层设立方法前切入点,根据方法名去切换指定库,比如方法名以query开头则切换到读取库,方法名以write开头切入到写库。
说实话楼主面试的公司不错啊,问的都是实实在在工作要用的。
0 请登录后投票
   发表时间:2011-12-29  
这些题确实出的不错,看来面试官还是很有水平的。
0 请登录后投票
   发表时间:2011-12-29  
关于第四个题目,个人一些感想。
1、应该是在考应用级别的缓存。
2、现在应用级别的缓存产品,很多(ehcache,JCache,JBossCache,WarmCache,OSCache),都能满足应用需求。如果采用其中一种产品,比如coherence,首先得考虑一点,代码不要和coherence耦合太厉害。(万一不用coherence,或者将来某种缓存不能满足使用时,只需要配置使用另外一种即可)。这就需要自己开发一套缓存接口了。
3、缓存,在business layer呢?还是在data access layer呢?
4、缓存的架构,缓存的内容,缓存的更新、同步。
0 请登录后投票
   发表时间:2011-12-29  
zuoshu 写道

第五题,给个实现,用的工厂方法,欢迎高手拍砖,说策略模式的同学来探讨下。

大致思路是,有一个抽象类ArrayHandler,定义process方法处理List里面的数组。分别有IntArrayHandler,StringArrayHandler以及其他继承ArrayHandler。

ArrayHandlerFactory是Handler的工厂,createHandler方法根据数组的类型返回不同的Handler

Client为调用工厂方法的类。代码如下

ArrayHandler

package zuoshu.pattern.q1;

public abstract class ArrayHandler {
	Object mArray;//用Object而不用Object[]是因为输入数组可能是int[]
	//用抽象类而不用接口是因为要有构造函数来接收输入的数组
	public ArrayHandler(Object array){
		mArray = array;
	}
	public abstract void process();//处理数组的方法
}

 ArrayHandlerFactory

package zuoshu.pattern.q1;

public class ArrayHandlerFactory {
	public static ArrayHandler createHandler(Object array) {
		Class c = array.getClass();
		//int[]
		if (c.equals(int[].class)) {
			return new IntArrayHandler(array);
		} 
		//String[]
		else if (c.equals(String[].class)) {
			return new StringArrayHandler(array);
		}
		//unimplement
		else {
			return new UnsupportArrayHandler(array);
		}
	}
}

 IntArrayHandler

package zuoshu.pattern.q1;

public class IntArrayHandler extends ArrayHandler {
	public IntArrayHandler(Object array) {
		super(array);
	}
	@Override
	public void process() {
		System.out.println("processing int[]");
	}

}

 StringArrayHandler

package zuoshu.pattern.q1;

public class StringArrayHandler extends ArrayHandler {
	public StringArrayHandler(Object array) {
		super(array);
	}

	@Override
	public void process() {
		System.out.println("processing String[]");
	}

}

 UnsupportArrayHandler

package zuoshu.pattern.q1;

public class UnsupportArrayHandler extends ArrayHandler {

	public UnsupportArrayHandler(Object array) {
		super(array);
	}

	@Override
	public void process() {
		System.out.println("unimplemented array handler:" + mArray.getClass());
	}

}

 客户端调用方法如下

package zuoshu.pattern.q1;

import java.util.List;

public class Client {
	public void doTask(List<Object> list) {
		ArrayHandler handler;
		for (Object o : list) {
			handler = ArrayHandlerFactory.createHandler(o);
			handler.process();
		}
	}
}

 写了个测试如下

package zuoshu.pattern.q1;

import java.util.ArrayList;
import java.util.List;

public class Q1 {
	public static void main(String[] args) {
		Integer[] intArray = new Integer[5];
		String[] stringArray = new String[5];
		Object[] objArray = new Object[5];
		List<Object> list = new ArrayList<Object>();
		list.add(intArray);
		list.add(stringArray);
		list.add(objArray);
		Client c = new Client();
		c.doTask(list);
	}
}

 输出如下

processing int[]
processing String[]
unimplemented array handler:class [Ljava.lang.Object;

 

欢迎高手讨论

 

 

 

其实个人觉得策略模式和工厂还真差不多,哪种都可以实现

我倒是关心为什么用工厂模式,好处在哪里,而这个好处策略模式又是没有的

 

0 请登录后投票
   发表时间:2011-12-29  
Brera 写道
3、JVM线程多,资源快消耗被完,应该怎么处理。
不知道怎么回答


线程池吗?
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics