设计模式

六大设计原则:

一.单一职责:一个类只负责一个功能,比如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指针,来拿到你的真实类型)

 

 

 

posted @ 2020-05-12 21:56  brx_blog  阅读(171)  评论(0编辑  收藏  举报