来一个设计的问题

积木 2004-11-12 12:23:29
我现在正在做一个画图工具,利用MFC。我现在的结构是让CView这个class来
维护一个vector<CGraphic*>,所有的图元class都从CGraphic来继承,在CView中加一个工厂方法
创建这些图元。
现在有一个问题,这个画图工具需要支持选择图元,移动图元,等功能。
也就是说那个CView有两个状态需要切换:添加图元,选择移动图元。
那么可能我在OnLButtonDown这个函数里面要写
if(添加图元)
{
pGra= CreateGraphic(kind);
}else if(选择移动图元)
{
pGra->Move();
.....................
}
不仅这个函数,其他的函数可能都会有这样的结构,例如OnMouseMove等等,
如果将来还有别的什么状态,就会造成很多函数都需要修改,使得代码的扩展性很差。

希望我的问题说明白了,我现在应该是用什么样的模式呢?我应该如何设计
...全文
263 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henry0 2004-11-27
  • 打赏
  • 举报
回复
void OnLButtonDown
{
pGra->operate(kind);
}


STATE与FACTORY合用,
kind可以这样规定, 当kind>0 时表示为创建,其值表示创建图形的类型
          当kind<0 时表示移动,其值可以为移动的参数,类型(如是否显示移动后的位          置,虚线显示等)
Jinhao 2004-11-26
  • 打赏
  • 举报
回复
fallhunter(不乖) 的方法很好也,然后再考虑点State模式,下面随便实现了一个,有兴趣有看看吧,希望来讨论讨论

typedef CGraphic elem_type;

class state_base
{
public:
virtual ~state_base(){};
virtual void operation(elem_type&) const =0;
};

class state_add_graph: public state_base
{
public:
void operation(elem_type& r_gra) const
{
r_gra = CreateGraphic(kind);
}
};

class state_move_graph: public state_base
{
public:
void operation(elem_type& r_gra) const
{
r_gra->Move();
//......
}
};

template<typename T>
struct distinguish_state
{
static const int value = 0;
};

template<>
struct distinguish_state<state_add_graph>
{
static const int value = 1;
};

template<>
struct distinguish_state<state_move_graph>
{
static const int value = 2;
};

class current_state
{
current_state(const current_state&); //non-copyable
current_state& operator=(const current_state&); //non-copyable
public:
current_state():p_state_(0),state_id_(0){}
~current_state()
{
delete p_state_;
}

template<typename StateType>
void set_state_t()
{
delete p_state_;
p_state_ = new StateType();
state_id_ = distinguish_state<StateType>::value;
}

template<typename StateType>
bool state_equal() const
{
return state_id_ == distinguish_state<StateType>::value;
}

int get_state()
{
return state_id_;
}

void do_operation(elem_type& r) const
{
if(p_state_)
p_state_->operation(r);
}
private:
state_base* p_state_;
int state_id_;
};


current_state cur_state; //在程序开始时,定义一个这个对象

//当前状态被改变
cur_state.set_state_t<state_add_graph>(); //添加图元

然后在OnLButtonDown中
CGraphic graph;
cur_state.do_operation(graph);

cur_state.state_equal<state_add_graph>(); //cur_state当前状态和state_equal比较 返回bool

cur_state.get_state(); //得到状态值,返回int

------------------------------------

其中如果有新的状态加入进来,就从state_base派生一个新的类出来,并把操作加进去
class state_new : public state_base
{
public:
void operation(CGraphic& r) const
{
新状态的操作
}
};
然后还要特化一个新的
template<>
struct distinguish_state<state_new>
{
static const int value = 3; //状态值,与state_new对应的系统本身的状态
};

newsuperstar 2004-11-26
  • 打赏
  • 举报
回复
顶一下
xunfengxxx 2004-11-26
  • 打赏
  • 举报
回复
高深的技术还没有学到
学习
大雾 2004-11-24
  • 打赏
  • 举报
回复
同意csumck(格式FAT20)说的,将图元的创造和管理放到文档类中,CView只是这些图元的表现形式。
另:以后楼主肯定会增加图片存储等功能,更需要文档类的序列化来承担。
5iDream 2004-11-21
  • 打赏
  • 举报
回复
学习!
banjo 2004-11-19
  • 打赏
  • 举报
回复
method dispatch,效率高
template<int optype,Graph* p>
{

}
template MouseInterpret<MoveType,Graph* p>
{
...
}

template MouseInterpret<CreateType,Graph* p>
{
...
}
hslinux 2004-11-15
  • 打赏
  • 举报
回复
学习ing
sharkhuang 2004-11-15
  • 打赏
  • 举报
回复
楼上说得是composite
csumck 2004-11-14
  • 打赏
  • 举报
回复
我最近也在看模式的问题,也是以图形处理系统未来研究的。
画图工具工作的对象是文档,CView是对文档的显示,因此我认为各个图元的生成应该在文档类中完成。
图片处理工作要脱离CView,它应该可以在没有任何UI的情况下完成。可以想象在一个仅有命令行的图形编辑系统中我们可以输入"Line(0,0)To(100,100)"命令来画一条直线。而且脱离CView也有个好处,这便于系统级的移植,因为CView依赖于系统,而文档依赖于数据结构。
系统中应该使用命令模式,文档类描述数据结构,而命令类描述行为,数据与方法分离这是常用的手法。
各个图元类可以使用递归的组合模式。使用工厂模式生成文档。
aileen108 2004-11-14
  • 打赏
  • 举报
回复
请帮忙编一下这个程序吧 汇编语言的 谢谢了 !试编制一个程序,把AX中的十六进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中。例如,当(AX)=2A49H时,程序执行完后,MEM中的4个字节内容为39H,34H,41H和32H。

sharkhuang 2004-11-14
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3509/3509845.xml?temp=.2152979
State是比较合适
sharkhuang 2004-11-14
  • 打赏
  • 举报
回复
visit呢?
hjunxu 2004-11-13
  • 打赏
  • 举报
回复
感觉如果从面向接口的方向来做可能会清晰一些。
hjunxu 2004-11-13
  • 打赏
  • 举报
回复
if(添加图元)
{
pGra= CreateGraphic(kind);
}else if(选择移动图元)
{
pGra->Move();
.....................
}
这种判断是肯定要的
积木 2004-11-12
  • 打赏
  • 举报
回复
to:caslwzgks(梦想家)
有想法就详细的写写呗,嘿嘿。
caslwzgks 2004-11-12
  • 打赏
  • 举报
回复
采用观察者模式吧,把图的添加和移动及其它编辑操作当作是对模型的一种修改。
积木 2004-11-12
  • 打赏
  • 举报
回复
嘿嘿,还有没有什么其他的方法没有啊?这个方法我已经准备开始用了,hiahia
哥们才学了模式两个月,不能贯通啊。ft
北极猩猩 2004-11-12
  • 打赏
  • 举报
回复
State模式就好了,挺合适的
jitian81411 2004-11-12
  • 打赏
  • 举报
回复
帮你顶了!
加载更多回复(2)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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