zoukankan      html  css  js  c++  java
  • 设计模式

    六大设计原则:

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

     

  • 相关阅读:
    20200414:mysql原子性和持久性怎么保证
    20200417:说说redis的rdb原理。假设服务器的内存8g,redis父进程占用了6g,子进程fork父进程后,子父进程总共占用内存12g,如何解决内存不足的问题?(挖)
    [九省联考2018]秘密袭击coat
    CF1158F Density of subarrays
    忘情
    [IOI2018] meetings 会议
    [AGC013E] Placing Squares
    [八省联考2018]林克卡特树
    [NOI2016] 国王饮水记
    [十二省联考 2019]皮配
  • 原文地址:https://www.cnblogs.com/brxHqs/p/12879086.html
Copyright © 2011-2022 走看看