设计模式
六大设计原则:
一.单一职责:一个类只负责一个功能,比如OrderServcie,OrderController
二.里氏替换:子类可以扩展父类,但是不要去重写父类的原有方法(功能)
三.依赖倒置:一般认为接口的稳定性(改变的可能性更小)大于实现类,使用的时候,使用接口类型,面向接口编程。
四.接口隔离原则:接口的设计细粒度要小,实现最小功能单元,比如UserService,VipUserService,两个接口。
五.迪米特法则:降低耦合度,局部变量里不要引入新的类,可以通过成员变量声明,方法参数声明来显示类的结构。
六.开闭原则:对扩展开放,对修改关闭;对开发完成的功能,尽量不要去修改原代码。
tips:一三六重点关注
常用设计模式:
一)工厂模式:将对象的创建和使用解耦,创建者黑盒创建,使用者只管使用,知接口不知实现类(面向接口编程)
1.静态工厂:比如写一个水果工厂,用来生产各种水果,提供一个工厂方法(生产水果的具体实现);把所有对象的创建逻辑集中到一个类里,
缺点:增加新的水果需要修改工厂方法(违背开闭原则); 生产苹果的,和生产香蕉的是一个工厂(违背单一职责);有点:简单,类少
2.工厂方法模式:将多个工厂通用的生产水果的行为抽取出来,比如 public IFruit createFruit();然后具体的工厂来实现该接口,生产具体的水果;
可以根据环境配置,注入具体的工厂即可;比如@Autowired privte IFruitFactory factory(spring喜欢的手法);
3.抽象工厂模式:比如苹果工厂现在要生产苹果,同时还希望苹果包装盒工厂生产苹果包装盒,那么此时,可以将两个工厂方法放在一个接口类里,即苹果抽象工厂;
得知:工厂方法模式是抽象工厂的特例,是只有一个方法的抽象工厂;抽象工厂是将一个系列的产品的工厂合并成一个工厂;
public abstract class AbstractFactory { //产品没有共性的时候使用 public abstract Vehicle createVehicle(); public abstract Weapon createWeapon(); public abstract Food createFood(); }
4.建造者模式(特殊的工厂模式:Build接口+Build实现类):使用于对象的创建过程比较复杂,让创建的过程模板化
比如现在要给三种固定水果指定不同的价格,以及最后给定一个折扣(vip水果套餐优惠10元,假日套餐优惠8元,这两种套餐);
1.先定义建造行为Builder接口,接口包含 void setApplePrice(int price) ... ... 以及一个返回套餐实例方法 Meal getMeal(); // builder实现类里持有apple或者new apple
2.实现Builder接口,职责:为导演类服务;
3.创建导演类,用来调度builder的行为,比如先new 一个builder实现,然后给苹果设置10元,再给xx,再给xxx,最后调用getMeal();
二)单例模式:懒汉,饿汉(先吃),枚举,内部类
三)适配器模式:
类与类之间的关系有两种模式:继承+组合(推荐)
没有OrangeBag时,只有AppleBag时,我们又想要OrageBag,那么只需OrangeBag org = new OrangeBagAdapter(new AppleBage());
缺点:OrangeBagAdapter是针对AppleBage ->OrangeBag的转换,具有强耦合
四)桥接模式:
现在有不同大小的袋子,袋子有不同的材质,如何定义不同材质不同大小的袋子的装入行为:
定义材质接口,定义袋子抽象类(持有材质属性,构造时传入,定义抽象装入方法),这个抽象类,充当桥接角色
场景:当产品方向有两个或两个以上维度的扩展方向时使用
适配器VS桥接:
五)装饰器模式:
核心:增强功能
六)组合模式:树形结构node
七)外观模式:
(facade)很像服务聚合,向外部开放流程性的接口,降低客户端的调用难度,比如controller的接口方法,组合service
八)模方法模式:
父类编排主业务流程,将通用虚拟方法延迟到子类去是实现,子类去聚焦虚拟方法的具体实现
九)策略模式:
定义策略接口,策略有统一的入参,出参,行为,无状态;一般将策略加载到内存,缓存里,直接选取,通过注入不同的策略,来实现不同的行为
十)责任链模式:
类似链表结构(感觉像是装饰器模式的扩展,都是实现接口,持有接口(next),只不过他的节点都有对应的处理条件,满足条件,传递到next,不满足则停止传递),适用于多个对象处理同一个请求时,首次加载责任链,让请求在链中流动,将所有处理对象编成链表;将调用者和实现者解耦 // 场景:filter,logger,流程审批
十一)观察者模式:
场景:一个对象的状态改变时,通知其他(多个)对象【单个对象时,类似回调】
jdk提【[线程安全】:Observable类(目标类) Observer(观察者) ,目标类持有观察者集合,可以更改状态,发布事件
十二)命令模式:
将不符合抽象编程的handler(没有共同方法定义的行为),引入Command命令接口,进行抽象编程
十三)访问者模式:
处理后:
双重分派机制: client里:你调用我,你里:我调用你(this指针,来拿到你的真实类型)