作者H45 (!H45)
看板CSSE
标题Re: [问题] 反design pattern的见解
时间Mon Feb 12 00:11:50 2007
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 210.208.46.43
: ※ 编辑: mgtsai 来自: 210.208.46.43 (02/10 06:25)
: 推 tinlans:我有点好奇,你是不是让 visitor 做太多事情了,并不一定 02/10 16:14
: → tinlans:所有的事情都要给 Accept() 转呼叫的东西通通做完吧, 02/10 16:15
: → tinlans:反正会选用 visitor 的时候,已经决定破坏被 visit 对象 02/10 16:15
: → tinlans:的封装性了,你可以把相关的资讯记录在这两者之外的地方。 02/10 16:16
: → tinlans:包括需要这些资讯才能完成的动作,也一并抽出 visitor。 02/10 16:17
我想封装性并不全然消失
在java如果修饰子不写上public | protected | private的话
就会是packaged
这样一来,在不同的package中使用这个物件时,无法存取内部资讯
封装性仍然存在的
举例:House是原继承树,Visitor我把它省略了,Main则是另一个package使用到House的
主程式。
=House=
package myAPI.Test;
public class Unstable_node implements Node {
// Unstable的设定值
int configurationValue;
public void accept(Visitor v) {
v.visit(this);
}
}
=Main=
package home.work;
import myAPI.Test.*;
public class Main {
public static void main(String args[]) {
Node n = new Unstable_node();
// Access Deny, 这边编译不会过,资讯的隐藏机制仍然存在
// 封装性并没有完全消失
n.configurationValue = 1;
}
}
最後补一下,如tinlans所说的
visitor不应该做太多的事情,如果需要共享资讯的话
应该把它们提炼到另一个物件供house, visitor来存取
: 推 YuYuHo:vistor visit house,我觉得vistor最大的缺点 02/10 16:18
: → YuYuHo:是带给house太大的负担 02/10 16:21
: → YuYuHo:打错字了,是visitor,刚打完麻将回来,win~~ya~~ 02/10 22:52
: → YuYuHo:假如说house的内部节点其实是不稳定的型态,结果会造成 02/10 22:54
: → YuYuHo:visitor的介面也变得很不稳定,很容易就搞得一团乱 02/10 22:55
: → YuYuHo:通常采用visitor时,house本身的结构可能就很复杂了, 02/10 22:57
: → YuYuHo:这时候还要管理节点的分派策略,还要维持节点稳定, 02/10 23:01
: → YuYuHo:这表示house做好後就不能随便更动,很容易牵一发动全身. 02/10 23:02
请问不稳定的型态是什麽意义
是指需求改变?还是设计的失误?
为什麽house做好後就不能更动,这和visitor有什麽直接的关系呢
如果不采用visitor的话,那麽原本要加在继承树上面的功能又该怎麽处理?
牵一发动全身我同意
但是使用visitor pattern之後
动到的「全身」应该会比不用visitor pattern来得少吧?
抱歉,我实在是不懂YuYuHo的这段推文
照他的说法,visitor pattern看似限制住了house扩充或修改的弹性
但是我不这麽认为....
不采用visitor的话,当初用visitor在继承树上面加入的功能又该怎麽办?
还有什麽更好的主意吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.213.121
1F:推 tinlans:其实我要说的破坏封装性,是指 house 被迫 open 给 02/12 15:26
2F:→ tinlans:visitor 的部分,因为 visitor 本身跟 house 是分离的。 02/12 15:27
3F:→ H45:你说的没有错,我所要补充的是「封装性」在另一个观点来看,并 02/12 16:34
4F:→ H45:没有消失。 我想我们所描述内容的应该不会造成冲突 02/12 16:38