浏览 2025 次
锁定老帖子 主题:结构模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-04
因为模式的需要,所以这里不的不开始用interface了,我会尽量控制. 代码是随手敲的,肯定有问题的,模式是思想,结构只是表现形式,并不是非常严格固定的. Proxy,Adapter,Decorator这3个模式看起来太像,都使用聚合,所以把他们在一起分析. 如果说在这些模式的类名上,没有XxxxProxy,XxxxAdapter..咋一看肯定是没法区分出哪种模式,为什么呢? 因为他们之间只存在语意上的区别: 单一聚合的使用技巧. 延迟装载 此对象非彼对象.在DAO中,有些模型对象太大 ,但又不的不有这个大头,怎么办呢?我们可以使用Proxy进行延迟载入. Proxy //模型接口 interface User{ String getUsername(); void setUsername(String str); Address getAddress(); void setAddress(Address addr); } //模型代理对象,内部数据并不完全 class UserProxy{ private int id; private String username; private Address addr; //...username; public Address getAddress(){ //代理在这,只有需要addr时候才去从数据库DAO载入 addr = AddressDAO.getAddress(id); return addr; } public void setAddress(Address addr){ this.addr = addr; } } 是不是很神气? ^^ proxy的意思就是用代理对象去代替真实的对象,只需要代理对象在需要的时候给出真实的数据就行了,具体从哪儿给 比如说RemoteProxy,还是什么,都给隐藏掉 很爽吧 ^^ 匹配旧有的类 现在有一个类,他负责操作一个机器,这个类开始就固定好了的,比如说要机器移动,x.start(), 很不爽,感觉移动应该叫move()才对, 与我们的代码语意不符,怎么改呢,就可以用到Adapter了. Adapter class Machine{ public void start(){ //移动机器 } } class MachineAdapter{ private Machine mac = new Machine(); public void move(){ mac.move(); } } /**感觉是不是有点不真实? ^^ 模型就是这样简单,但是这个模式的作用真正是大大的,我们现在为什么使用spring可以不用管底层具体是哪个组件,就是依靠它了, 当确定使用的组件后, 进行adapter就可以在高层调用统一代码了*/ Decorator 有时候一个类给我们,可是我们并不完全满意它所提供的功能, 想要修改这些功能 ,怎么办呢? Decorator就出场了. 它给了我们修改以有类代码的增,删改能力.具体例子看: http://www.iteye.com/topic/262243 刚写的,里面有个, 不想弄第2遍了 Facade 这个应该是相当熟悉的了, 在DAO操作中,Action类有时候需要进行多种数据对象操作,就出现了操作数据的DAOManager类,在这里,它进行所有的dao DAOManager{ public void getCash(String id, String cash){ Auth.doCheck(); UserDAO.get... //其他DAO行为 } } /**他的作用是封装掉麻烦的调用,这样就可以把那些麻烦转换成行为操作,直接getCash了*/ Bridge 现在有2套系统,我想要非常方便在进行切换,如何做呢? 这,我们就可以把行为与抽象分离了 Helo{ //逻辑 void doHelp(); } HelpVersion{ doCheck(); } HelpVersionImpl{ public void doCheck(){ //行为 } } HelpImpl{ private HelpVersion ver = new HelpVersion(); public void doHelp(){ ver.doCheck(); } } /**替换的时候只需要改下ver就可以随意替换了,openjdk里有很多这个结构,而且类名字都叫HelpVersion1 HelpVersion2,它就是为了方便切换java1和j2se的*/ Flyweight 这是一种设计类的方式,让对象简单.假如以一个村子为基础为每个人设计信息,因为他们的地址基本相同的,那么: class Person{ //.... } class Country{ private HashMap nameMap = new HashMap(); private String addr ="住址:....."; //把人信息放入村子里 public void setPerson(Person p){ int id = p.getID(); String name = p.getName(); nameMap.put(id, name); if(addr ==null) addr =p.getAddress(); } //得到人信息 public Person getPerson(int id){ Person p; String name = nameMap.get(id); p = new Person(id, name , address); return p; } } /**把对象里大量的address删除了,但依然可以得到相关的Person*/ Composite 留空,明天写,累了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-04
照例总结下:
Proxy 给我们修改类中信息来源能力 Adapter 给我们修改方法名的能力 Decorator 给我们修改方法逻辑能力 Facade 把大量的讨厌的结构封装掉,调用起来清晰 Bridge 轻易更换底层逻辑能力 Flyweight 减少类中域的的数量,改善内存优化 |
|
返回顶楼 | |
发表时间:2008-11-18
几行代码把模式表达得不错!
|
|
返回顶楼 | |