设计模式——可维护性篇
关于如何“创建类的新实例”的模式
工厂模式
目的:解决用户不想直接在client代码中指明要具体创建的实例,或不知道要创建哪个具体类的实例的问题
途径:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个 类的实例化延迟到其子类
具体一点,新建工厂类,写新创建的方法,将客户端中创建新对象的功能委托给该工厂方法
抽象工厂模式
目的:创建一组相关/相互依赖的对象
途径:提供接口以创建一组相关/相互依赖的对象, 但不需要指明其具体类,具体的组合由这个接口决定
例子: 一个UI, 包含多个窗口控件,这些控件在不同的OS中实现不同
具体的构造方法基本同上
结构
代理模式
目的:某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问 到
途径:设置proxy,在二者之间建立防火墙
结构如上图,代理的类里有真正的类,用户定义的时候创建的是代理类,只有当涉及到一些代价比较大的操作时,才会将该功能真正调用,这里用的是委托。
行为
observer模式
目的:一个类observer需要对另一个类subject的状态变化时刻掌握,类比粉丝和偶像
细节:observer类在构造器中声明自己的subject,,而后调用subject的注册方法,将自己加入subject的观察者列表中,同时observer类里有一个update方法供subject类回调,来通知subject的状态变化;subject类有观察者列表,同时有通知的方法,委托给observer类的update方法
visitor模式
目的:对特定类型的object的特定操作(visit),在运行时将 二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类
途径:为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码 可以在不改变ADT本身的情况下通过delegation接入ADT
具体细节:ADT有一个accept方法,参数是visitor类,方法内就是将功能委托给visitor类,v.visit(this);visitor类有visit方法,对传入的对象进行操作
注:visitor模式是唯一一个双向委托的类!!!!!!