]]>jdk集合cȝ设计之一http://www.aygfsteel.com/zhqh/articles/222021.htmlzhqhzhqhThu, 14 Aug 2008 07:34:00 GMThttp://www.aygfsteel.com/zhqh/articles/222021.htmlhttp://www.aygfsteel.com/zhqh/comments/222021.htmlhttp://www.aygfsteel.com/zhqh/articles/222021.html#Feedback0http://www.aygfsteel.com/zhqh/comments/commentRss/222021.htmlhttp://www.aygfsteel.com/zhqh/services/trackbacks/222021.html
喜欢q样的网吗?虽然Q东西比较多Q但是,q是蛮清晰的。无Z喜欢与否Q这实是个好东西,于SUN公司的牛Z作。它是JDK里的集合部分。当Ӟq样的东西,只能是utilClass,如果你不想用Q完全可以自己造几个轮子,反正Q我是不会去造的Q除非满不了需求?
q个cdơ基本是Z接口的。从层C层,上层都是以抽象呈现的。然后,下层是具体的实现cR这没啥好说的,但是Q关键是Q如果让你设计这个的一个集合类层次。你会怎么设计呢?当然Q跑得v来的代码也叫设计Q这里就存在好的设计与糟p的设计之分了。所以,设计时要考虑很多因素Q比如可扩展性啦Q可l护性啦Q面向抽象编E啦QSRPQOCP{几个面向对象设计原则啦Q反正就是很多,大大小的综合因素权衡出一个设计结果。还有,千万不要看对于q样的类层次的深ȝ解,它对于你的面向对象思想有着极大的帮助。某某天Q你参与了一个项目,首先得会做设计哦Qƈ且,得设计好Q不Ӟ架构师就I有其名了?当我在思考这个主题时Q我产生了不想法。有些可能是不成熟的。还是列出来下?
1. 自上而下设计
2. 自下而上设计
3. Z接口的多个行为有异的cȝ承设?
1 . 自上而下设计
概念很明,是从接口抽象类开始。但是,你必d于几个具体实现的抽象部分有着清晰的认识。ƈ且你大致了解了这些具体实现类的规模以及职责所在,否则变成了异Ş。然而,设计本n是个跌代的过E,所以,q是个不错的选择Ҏ?
2。自下而上设计
你不了解具体实现cȝ规模以及职责所在,你只是随意或者仅仅针对于某一需求,写了一个辅助类。当Ӟ你知道这个类是个有状态类Q同Ӟ它似乎在某个时刻跟别人有着某某关系Q不知道是承还是委托)Q所以,你没把这个类设计成ؓabstract, final, private constrcutor,OKQ你只是保留着q种变化。然后,你又写了一个类Q然后,发现q两个类有着共同的部分。然后,又写了一个,发现了不新的东ѝ恩Q很好,需要动作了Q你开始思考怎么用设计模式把q些共同部分Q可能在不同cL不同的实玎ͼl织h。对于,抽象ҎQtemplate模式能帮你解军_部分问题。同Ӟ你需要到委托Q所以,你还得考虑怎么使用委托才能得到良好的设?---可参考设计模式之q化论?
3。基于接口的多个行ؓ有异的类l承设计
无论采用哪一U方式做设计。都能得到最l的好结果。而结果也基本是一致的?
下面是个例子?
你写了一个接?q且提供了两实现cR?
interface MyInterface{
public void println();
public void print();
public int size();
public boolean isEmpty();
}
class MyConcreteClassA implements MyInterface{
public boolean isEmpty() {
return size() == 0;
}
public void print() {
System.out.print("A");
}
public void println() {
System.out.println("A");
}
public int size() {
return 0;
}
}
class MyConcreteClassB implements MyInterface{
public boolean isEmpty() {
return size() == 0;
}
public void print() {
System.out.print("B");
}
public void println() {
System.out.println("B");
}
public int size() {
return 0;
}
}
然而,你又发现q两个实现类中有着共同的东?-isEmptyҎ。所以,你得提取出来Q顶层是个接口,没法攑֮C。放哪里呢?有一个好的办法,是把接口改成抽象类。记住,接口的条件比抽象cL强。改造如下:
abstract class MyAbstractClass{
public abstract void println();
public abstract void print();
public abstract int size();
public boolean isEmpty(){
return size() == 0;
}
}
class MyConcreteClassA extends MyAbstractClass{
public void print() {
System.out.print("A");
}
public void println() {
System.out.println("A");
}
public int size() {
return 0;
}
}
class MyConcreteClassB extends MyAbstractClass{
public void print() {
System.out.print("B");
}
public void println() {
System.out.println("B");
}
public int size() {
return 0;
}
}
q个template模式帮你解决了问题。同Ӟ你也能保持住Z抽象~程q个好东ѝ?
那么Q还有一U方案,也就是JDK设计所使用的?
interface MyInterface{
public void println();
public void print();
public int size();
public boolean isEmpty();
}
abstract class MyAbstractClass implements MyInterface{
public abstract void println(); --------Q?Q?
public abstract void print(); --------Q?Q?
public abstract int size();
public boolean isEmpty(){
return size() == 0;
}
}
class MyConcreteClassA extends MyAbstractClass implements MyInterface{ --------Q?Q?
public void print() {
System.out.print("A");
}
public void println() {
System.out.println("A");
}
public int size() {
return 0;
}
}
class MyConcreteClassB extends MyAbstractClass implements MyInterface{ --------Q?Q?
public void print() {
System.out.print("B");
}
public void println() {
System.out.println("B");
}
public int size() {
return 0;
}
}
说明Q抽象类MyAbstractClass 的抽象方法(1Q和Q?Q可以不必显式写出来。因为抽象类会承接口的抽象Ҏ。同ӞcMyConcreteClassA 定义中(3Q的implements MyInterface{ 也可以不昑ּ写出。尽多了一个中间抽象类MyAbstractClass 层(有些公共Ҏ或者缺省方法已在此实现Q,但是q是必须实现MyInterface中剩下的所有接口方法?
q样的结果,很好。所有具体类的公共方法被抽象基类实现了,同时Q具体类也可以覆盖基cȝ~省Ҏ。对于子cL否支持某一个接口方法的解决Q在抽象基类中实C个缺省的Ҏ更是有效。否则,q是某一子类不支持该ҎQ也必须被实现。比如,你throw了一?UnsupportedOperationException异常。这样很不好?/div>