概况:将类中易变化的部分分离出为一个新类(分离责任),组合新分离的类,使的变化独立于本类,并可替换变化(实现易复写)。
知识点
1:将责任(或变化)分离(封装)
2:针对接口编程,而非具体实现。(Job a1 = new 法师(√)法师 a2=new 法师(×),a1可变灵活,a )
3:善用组合和继承/(多用组合,少用继承)
概述:定义一个一对多的依赖,当一个对象发生改变多个对象会受到通知。
1:为交互对象之间的松耦合设计而努力(针对接口编程)
*Observable应该是消息的分发者而不一定是生产者
概述:在不修改代码的情况下,动态赋予类新责任(组合),并保持类不变(继承)
1:类应该对扩展开发,对修改关闭。(组合)(按上图,若亚索要改变自己的speed,对扩展开发:动态增加改变speed代码(被buff装饰);对修改开发:在原类上增加定向修改speed代码)
所有工厂都是用于封装对象的创建。
*:要依赖抽象而非具体类
简单工厂:简易封装一组对象创建,实现了1级抽象
工厂模式:利用继承父类抽象方法,由子类决定具体工厂,实现了2级抽象
抽象工厂模式:利用组合,提供一个同时可以创建多个不同对象(依赖对象家庭)的接口
//工厂模式抽象 1:ps. 2:createPizza PizzaStore ps = new NewYorkPizzaStore(); Duck duck = ps.createPizza(PizzaA);
概述:一个类只有一个实例,与一个全局访问点
方法:静态方法static createIns + 静态创建钩子(防止多次实例化)static boolean existIns+ 私有构造函数 private XXX ( + 预防多线程破坏 )
预防多线程波坏:1:同步 2:立即实例化(类全局变量) 3:二级钩子,内钩才要求同步
适应情景例:线程池,注册表,缓存,驱动程序......(黑人?)
概述:将函数封装成对象,以便1:规范化执行execute() 2:记录一些数据
适应情景例:撤销操作,任务队列,日志请求
撤销:每个具体Command实现undo,undo可根据一个保存变量决定
工作队列:因为execute()是接口协议,工作队列xxCommone.execute(),可抽象依次执行
日志请求:每次execute(),save()一个状态到服务器,并能load()
*:最少知原则:尽量和你的密友谈话
适配器定义:将一个类的接口变成期望的类的接口
真实世界的适配器:Iterator(新) --> EnumAdapter(创建) ——>Enum (旧)
外观模式定义:组合多类提供简化接口
*:别来调用我,我(高级)来调用你(低级)
概况:父类定义算法骨架(结构),采用继承,具体细节使用抽象函数交给子类决定(工厂模式是模板方法的特殊情况)
(心得:找到程序不变的地方,也就找到易变的地方,分别封装,再统一抽象接口)
钩子:一种声明再抽象类的方法,但只有空或默认的实现。子类可使用钩子控制或改变父类的一些结构流程。但却使得子类(低)并没有调用父类(高)。
自然中的模板方法和变形:sort中的compareTo();