设计模式笔记01

tech2024-08-18  44

策略模式

概况:将类中易变化的部分分离出为一个新类(分离责任),组合新分离的类,使的变化独立于本类,并可替换变化(实现易复写)。

知识点

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();

 

 

 

最新回复(0)