结构模式
前面说过,结构模式指的是在设计上只使用基本结构:聚合,组合,继承的, 用结构来体现逻辑.
因为模式的需要,所以这里不的不开始用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;}}
class Machine{public void start(){ //移动机器}}class MachineAdapter{private Machine mac = new Machine();public void move(){ mac.move();}}/**感觉是不是有点不真实? ^^ 模型就是这样简单,但是这个模式的作用真正是大大的,我们现在为什么使用spring可以不用管底层具体是哪个组件,就是依靠它了, 当确定使用的组件后, 进行adapter就可以在高层调用统一代码了*/
DAOManager{public void getCash(String id, String cash){ Auth.doCheck(); UserDAO.get... //其他DAO行为}}/**他的作用是封装掉麻烦的调用,这样就可以把那些麻烦转换成行为操作,直接getCash了*/
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的*/
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*/