关于代码的重构问题!!设计模式~原则!!谢谢大家!!!!

Wuaner 2010-03-09 12:19:30
假设实体类ClassA有属性a b c d e f g.
现在我需要向ClassA对应表中插入六条记录。
其中a b字段是需要使用给定的值的(如:a需取遍"X,Y,Z,U,V,W",b在a取X、Y时取M,其他时候取N),
其他字段的值来自ClassB对应的字段。并且有下述要求:
对属性c:
若a取X,则c取classB.getX();
若a取Y,则c取classB.getY();
若a取Z,则c取classB.getZ();
若a取U,则c取classB.getU();
若a取V,则c取classB.getV();
若a取W:
if classB.getPar1=="CONSTANT1" 则c取"C1"
if classB.getPar1=="CONSTANT2" 则c取"C2"
else c取classB.getW();
属性d、e、f分别取用classB的par2、par3、par4即可。
当然,这样写肯定没错:


ClassA ca1 = new ClassA();
ca1.setA("X");
ca1.setB("M");
ca1.setC(classB.getPar1());
ca1.setD(classB.getPar2());
ca1.setE(classB.getPar3());
ca1.setF(classB.getPar4());

ClassA ca2 = new ClassA();
ca2.setA("Y");
ca2.setB("M");
ca2.setC(classB.getY());
ca2.setD(classB.getPar2());
ca2.setE(classB.getPar3());
ca2.setF(classB.getPar4());

ClassA ca3 = new ClassA();
ca3.setA("Z");
ca3.setB("N");
ca3.setC(classB.getZ());
ca3.setD(classB.getPar2());
ca3.setE(classB.getPar3());
ca3.setF(classB.getPar4());

ClassA ca4 = new ClassA();
ca4.setA("U");
ca4.setB("N");
ca4.setC(classB.getU());
ca4.setD(classB.getPar2());
ca4.setE(classB.getPar3());
ca4.setF(classB.getPar4());

ClassA ca5 = new ClassA();
ca5.setA("V");
ca5.setB("N");
ca5.setC(classB.getV());
ca5.setD(classB.getPar2());
ca5.setE(classB.getPar3());
ca5.setF(classB.getPar4());

ClassA ca6 = new ClassA();
ca6.setA("W");
ca6.setB("N");
if(classB.getPar1()=="CONSTANT1") {
ca6.setC("C1");
} else if(classB.getPar1()=="CONSTANT2") {
ca6.setC("C2");
} else {
ca6.setC(classB.getW());
}
ca6.setD(classB.getPar2());
ca6.setE(classB.getPar3());
ca6.setF(classB.getPar4());

dao.save(ca1...6);



但这显然不是好的编码风格,重复的代码应该提出来。问下大家,欲重构的话,应该采用什么样的设计模式,或者需要遵循什么样的原则那?

谢谢大家!!!
...全文
285 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wuaner 2010-05-05
  • 打赏
  • 举报
回复
顶顶顶顶顶
验证码识别 2010-03-16
  • 打赏
  • 举报
回复
MARK


学习
manutdsodagreen 2010-03-16
  • 打赏
  • 举报
回复
推荐你看看这个:
http://www.vincehuston.org/dp/factory_method.html
或者 整体的DP 23种

http://www.vincehuston.org/dp/
wzl_00 2010-03-16
  • 打赏
  • 举报
回复
都是高手呵!
Wuaner 2010-03-16
  • 打赏
  • 举报
回复
谢谢大家的热心回复!!!!!!

请继续 !
guoyueshan 2010-03-14
  • 打赏
  • 举报
回复
似乎其他属性的值都是由a的值决定的,那么可以用状态模式,a的值决定这个对象的状态,a的取值有几种可能性,就有几种状态,这样扩充起来也很方便。
Wuaner 2010-03-14
  • 打赏
  • 举报
回复
继续给答案啊。。。。。。。。。。。。。
Wuaner 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wn_1985 的回复:]
你这对象模型设计的好别扭
[/Quote]

这是一个非常大的系统,它就是这样设计的,我也没办法啊。。。
wn_1985 2010-03-10
  • 打赏
  • 举报
回复
你这对象模型设计的好别扭
henry_fuzr 2010-03-10
  • 打赏
  • 举报
回复
面向对象的思想 考虑 ClassA和ClassB存在什么关系
重返春季 2010-03-10
  • 打赏
  • 举报
回复
/*
* 生成器接口
*/
interface BuilderClass
{
public void buildA(String a);
public void buildB(String a);
public void buildC(String a, ClassB classB);
public void buildD(String d);
public void buildE(String e);
public void buildF(String f);
public ClassA getInstance();
}
/*
* 具体的生成器
*/
class BuilderClassAA implements BuilderClass
{
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;

private static final String X = "X";
private static final String Y = "Y";
private static final String Z = "Z";
private static final String U = "U";
private static final String V = "V";
private static final String W = "W";
private static final String M = "M";
private static final String N = "N";

public void buildA(String a)
{
this.a = a;
}
public void buildB(String a)
{
b = (a.equals(X) || a.equals(Y)) ? M : N;
}
public void buildC(String a, ClassB classB)
{
if (a.equals(X))
{
c = classB.getX();
}
else if (a.equals(Y))
{
c = classB.getY();
}
else if (a.equals(Z))
{
c = classB.getZ();
}
else if (a.equals(U))
{
c = classB.getU();
}
else if (a.equals(V))
{
c = classB.getV();
}
else if (a.equals(classB.getW()))
{
c = classB.getW();
}
}
public void buildD(String d)
{
this.d = d;
}
public void buildE(String e)
{
this.e = e;
}
public void buildF(String f)
{
this.f = f;
}
public ClassA getInstance()
{
return new ClassA(a, b, c, d, e, f);
}
}
/*
* 用于构建最终的对象
*/
class Product
{
private BuilderClass builder;

public Product(BuilderClass builder)
{
this.builder = builder;
}

public void build(String a, ClassB classB)
{
builder.buildA(a);
builder.buildB(a);
builder.buildC(a, classB);
builder.buildD(classB.getPar2());
builder.buildE(classB.getPar3());
builder.buildF(classB.getPar4());
}
}
/*
* 调用生成器
*/
public class BuilderClassA
{
public static void main(String[] args)
{
ClassB cb = new ClassB("par1", "par2", "par3", "par4", "xxx", "yyy","zzz", "uuu", "vvv", "www");
String a = "X";
BuilderClass builder = new BuilderClassAA();
Product finalBuilder = new Product(builder);
finalBuilder.build(a, cb);
ClassA ca = builder.getInstance();
System.out.println(ca.getA() + " " + ca.getB() + " " + ca.getC());
}
}
Monkey_D_Luffy 2010-03-09
  • 打赏
  • 举报
回复
还没学到这一课,但是帮顶一下,希望楼主能尽快解决问题
goosman 2010-03-09
  • 打赏
  • 举报
回复
分支太多了....就不写代码了...

我的看法还是用工厂比较好....如果数据只是由classB给定, 那么工厂的接口就只接受classB实例
Wuaner 2010-03-09
  • 打赏
  • 举报
回复
沙发抢这么快。。。刚要改个错误。。。这下倒好,又改不了了。。

代码第四行该是
ca1.setC(classB.getX());
sotom 2010-03-09
  • 打赏
  • 举报
回复
抢个so far.
narcissusoyf 2010-03-09
  • 打赏
  • 举报
回复
不用builder 那么多。。而且,如果你的builer是这样写的话,给写客户端代码的人会带来很阴郁的感觉。。。对于builder的中间过程,尽量采取方法链的形式。要保证创建过程不被打断。另外,有个明确的方法返回你要创建的最终对象。

public class Builder
{
private ClassB b ;

private ClassA aa;

public Builder(ClassB b)
{
this.b = b;
}


public Builder setA(A a)
{
aa = new ClassA ();
aa.setA(a);
if(a == "x")
{
aa.setB("m");
aa.setC(b.getX());
}
else if(a == "y")
{
aa.setB("m");
aa.setC(b.getY());
}
else if(a == "z")
{
aa.setB("m");
aa.setC(b.getZ());
}
else if(a == "u")
{
aa.setB("n");
aa.setC(b.getU());
}
else if(a == "v")
{
aa.setB("n");
aa.setC(b.getV());
}
else if(a == "w")
{
aa.setB("n");
if(b.getPart1() == "C1")
aa.setC("C1");
else if(b.getPart1() == "C2")
aa.setC("C2");
else
aa.setC(b.getW());
}
aa.setD(b.getPart2());
aa.setE(b.getPart3());
aa.setF(b.getPart4());


return this;
}


public ClassA createClassA()
{
if(aa == null)
throw new RuntimeException("");
return aa;
}


public static void main(String[] args)
{
ClassB b = new ClassB();
A a = new A("x");
//...
ClassA a = (new Builder(b)).setA().createClassA();
}
}
  • 打赏
  • 举报
回复
没明白要做什么,而且楼主举的例子也很敷衍!
TillPerfect 2010-03-09
  • 打赏
  • 举报
回复
额。。。写得有点多啊。。。
反正就是这个意思
lz记得要进行判空操作,避免空指针。我没有写
TillPerfect 2010-03-09
  • 打赏
  • 举报
回复


/*
* 生成器接口
*/
interface BuilderClass
{
public void buildA(String a);
public void buildB(String a);
public void buildC(String a, ClassB classB);
public void buildD(String d);
public void buildE(String e);
public void buildF(String f);
public ClassA getInstance();
}
/*
* 具体的生成器
*/
class BuilderClassAA implements BuilderClass
{
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;

private static final String X = "X";
private static final String Y = "Y";
private static final String Z = "Z";
private static final String U = "U";
private static final String V = "V";
private static final String W = "W";
private static final String M = "M";
private static final String N = "N";

public void buildA(String a)
{
this.a = a;
}
public void buildB(String a)
{
b = (a.equals(X) || a.equals(Y)) ? M : N;
}
public void buildC(String a, ClassB classB)
{
if (a.equals(X))
{
c = classB.getX();
}
else if (a.equals(Y))
{
c = classB.getY();
}
else if (a.equals(Z))
{
c = classB.getZ();
}
else if (a.equals(U))
{
c = classB.getU();
}
else if (a.equals(V))
{
c = classB.getV();
}
else if (a.equals(classB.getW()))
{
c = classB.getW();
}
}
public void buildD(String d)
{
this.d = d;
}
public void buildE(String e)
{
this.e = e;
}
public void buildF(String f)
{
this.f = f;
}
public ClassA getInstance()
{
return new ClassA(a, b, c, d, e, f);
}
}
/*
* 用于构建最终的对象
*/
class Product
{
private BuilderClass builder;

public Product(BuilderClass builder)
{
this.builder = builder;
}

public void build(String a, ClassB classB)
{
builder.buildA(a);
builder.buildB(a);
builder.buildC(a, classB);
builder.buildD(classB.getPar2());
builder.buildE(classB.getPar3());
builder.buildF(classB.getPar4());
}
}
/*
* 调用生成器
*/
public class BuilderClassA
{
public static void main(String[] args)
{
ClassB cb = new ClassB("par1", "par2", "par3", "par4", "xxx", "yyy","zzz", "uuu", "vvv", "www");
String a = "X";
BuilderClass builder = new BuilderClassAA();
Product finalBuilder = new Product(builder);
finalBuilder.build(a, cb);
ClassA ca = builder.getInstance();
System.out.println(ca.getA() + " " + ca.getB() + " " + ca.getC());
}
}
windforce9811 2010-03-09
  • 打赏
  • 举报
回复
模板加反射。

根据A的属性取值反射到B的属性。

剩余的动作提取一下,放到公用的方法里就OK了
加载更多回复(3)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧