MyException - 我的异常网
当前位置:我的异常网» C++ » 一个具体的设计模式的有关问题

一个具体的设计模式的有关问题

www.MyException.Cn  网友分享于:2013-04-08  浏览:7次
一个具体的设计模式的问题
我写C++有一段时间。但是目前有一个问题总是感觉解决不好。我有一个函数,需要被调用几次,每次的过程都大致相同,但其中某些步骤的实现有区别,此外还和输入数据的两种属性有关系。如下:

我目前的实现如下:

class Builder {

  build() {
  step1();
  step2();
  ...
  stepN(); 
  }

  step1() {...};
  virtual step3() {...}

};

class BuilderPhase1 {
  step1() {...}
  step3() {...}
};
class BuilderPhase2 {
  step1() {...}
  step3() {...}
};
class BuilderPhase3 {
  step1() {...}
  step3() {...}
};

class BuilderPhase1Attr1 {
  step1_1() {...}
};
class BuilderPhase1Attr2 {
  step1_1() {...}
};
class BuilderPhase2Attr1 {
  step2_3() {...}
};
...

大致是这样,基本上类的继承关系是一个树状。而且每个phase分类下面都需要对attribute再分子类,看起来很罗嗦。而需要在相同的attribute但不同phase之间共享代码时,只能把他们放在最顶的基类里面。

我这个设计感觉有些别扭。虽然的确消除了大量的switch/if的条件判断问题。
我现在想了另外一个设计,但是不知道是否可行,请高手指点一下:
class Director {
  BuilderPhase phase;
  BuilderAttr attr;

  Director(BuilderPhase p, BuilderAttr a) {
  phase = p;
  attr = a;
  }

  build() {
  step1();
  step2();
  ...
  stepN();
  }

  step1() {
  phase.step1_1();
  attr.step2_2();
  }
  ...
};
但是这样有个问题,可能BuilderPhase类中的方法需要调用BuilderAttr中的某些方法,或者反过来调用。这样我需要把Director的引用传给phase和attr对象,这样我担心会降低效率。因为多了不少间接引用,而有些函数调用是在两层以上的循环里面。

请高手指点一下我这个设计是否恰当。此外,是否有性能问题。
非常感谢!



我想这样可以避免增加很多



------解决方案--------------------

没怎么看明白····
------解决方案--------------------
好抽象,楼主你想干什么呢?

有空买本《设计模式》看看,反复钻研。继承别乱用。写出这种代码感觉就是师傅带的水平低。
------解决方案--------------------
还是没有搞明白,哎
------解决方案--------------------
看了半天也不是很明白,不过建议用类的聚集,如果继承的话这样会产生类的爆炸。
------解决方案--------------------
"我有一个函数,需要被调用几次,每次的过程都大致相同,但其中某些步骤的实现有区别,此外还和输入数据的两种属性有关系."
断章取义一下,如果是这样的实现方法可以为:将相同的提取出来组成单独的函数,然后声明一个虚函数实现不同的地方,子类实现需函数(也就是可能这个函数要被拆成几个函数)

如果函数的执行步骤大致相同但是代码实现都不同,如类似(1)初始化,(2)计算 (3) 发布结果这样的流程类似的,都可以按照上面的方法:声明虚函数,在基类的函数里调用这些虚函数来规定执行的流程,子类实现虚函数,然后多态调用基类的函数执行函数就可以了,貌似叫Template模式
------解决方案--------------------
但是这样有个问题,可能BuilderPhase类中的方法需要调用BuilderAttr中的某些方法,或者反过来调用。这样我需要把Director的引用传给phase和attr对象,这样我担心会降低效率。因为多了不少间接引用,而有些函数调用是在两层以上的循环里面。 

在红色部分,感觉你的设计的正交性不够,可以试着做一个BuilderHelper.
------解决方案--------------------
对phase和attr这两个概念的区分比较模糊,可以试着作出phase和attr共同基类...
------解决方案--------------------
探讨
to yuanhong2910: 谢谢。你说的对,我的确使用了template模式。不过这只能解决共享算法框架的问题,不能解决我所说的多属性的子类设计问题。

比如,某个步骤的实现,用条件语句写如下:
step1() {
case 0:
switch (attr2) {
case 0:
...
break;
case 1:
...
break;
case 2:
...
brea…

------解决方案--------------------
class BuilderPhase1 { 
step1() {...} 
step3() {...} 
}; 
class BuilderPhase2 { 
step1() {...} 
step3() {...} 
}; 

文章评论

亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
那些争议最大的编程观点
那些争议最大的编程观点
我是如何打败拖延症的
我是如何打败拖延症的
每天工作4小时的程序员
每天工作4小时的程序员
程序员应该关注的一些事儿
程序员应该关注的一些事儿
一个程序员的时间管理
一个程序员的时间管理
如何成为一名黑客
如何成为一名黑客
鲜为人知的编程真相
鲜为人知的编程真相
10个调试和排错的小建议
10个调试和排错的小建议
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员的鄙视链
程序员的鄙视链
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
 程序员的样子
程序员的样子
漫画:程序员的工作
漫画:程序员的工作
旅行,写作,编程
旅行,写作,编程
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
程序员必看的十大电影
程序员必看的十大电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
编程语言是女人
编程语言是女人
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老程序员的下场
老程序员的下场
中美印日四国程序员比较
中美印日四国程序员比较
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
总结2014中国互联网十大段子
总结2014中国互联网十大段子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
代码女神横空出世
代码女神横空出世
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员和编码员之间的区别
程序员和编码员之间的区别
为什么程序员都是夜猫子
为什么程序员都是夜猫子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有