设计模式学习

作为一个转行的小菜鸟,在项目中写代码时总是习惯性的根据项目逻辑来写代码,这样写出来的代码就很臃肿,可读性和维护性都不太好,下面记录一些自己学习的设计模式希望后续能写出更简洁的代码

设计模式

定义:设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式六大原则

单一职责原则

这个比较容易理解:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化
单一原则是实现高内聚、低耦合的指导方针,理解简单但运用的很好是很难的

接口隔离原则

使用多个接口要比使用一个单一的接口要好,类与类之间的依赖关系应该建立在最小的接口上
通俗点理解就是不要在一个类中放太多的方法,这样就会使得这个类很臃肿,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,专门的接口提供给不同的模块

依赖倒置原则

核心思想:面向接口编程,即写代码时要先想好接口,先写接口,依赖于抽象,而不是具体
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体

开闭原则

搜了很多文章是这么讲的:软件对象(类、模块、方法等)应当是对应该对于扩展是开放的,对修改是关闭的。通俗点讲应该是一个工程,如果要新增功能的话,不能去修改原有的代码,要做到像一个插排一样,需要什么功能,插上对应的模块就可以了。
 
为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类

里氏替换原则

简单理解就是子类可以代替父类出现在父类可能出现的地方,所以子类应当满足以下条件:
1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2、子类可以增加自己特有的方法
3、当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更宽松
4、当子类的方法实现父类的抽象方法时,方法的返回值应比父类更严格

里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

迪米特法则

又叫最小知道原则,顾名思义,即一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立

常用设计模式

单例模式

手写单例模式注意点:
首先要做的是把构造器私有化,这样外界无法直接调用,只提供get方法
然后再get方法中,对instance进行判断,为空时进行new,不为空时直接返回
如果只进行一次判空操作,多线程情况下可能同时有多个线程都走到了判空操作,这样就可能产生多个单例,解决方法:使用synchronized关键字(保证new实例的部分最多只有一个线程可以获得(在这里进行一次判空操作,即最多有一个线程走到判空操作)),但是这样效率会低,因为大部分情况还是不为空的,如果只给一个线程进行判空,降低了效率,这样也就有两层判空的出现。

但是双重检测在jdk1.5之前还是有问题的,罪魁祸首:指令重排(总结就是:还没进行对象初始化呢,就返回了对象的引用,这样第一个线程获取了实例,第二个判断不为null了,直接用,就出问题了,所以要使用volatile禁止指令重排,使双重检测真正发挥作用)

public class Singleton{
    private volatile static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
     }
}

策略模式

策略模式个人认为是比较好利用到实际工作中的,项目中有很多代码逻辑都是基于参数类型做不同的处理,就很容易写出大段的if else的代码,这样的代码不仅易读性不好,还容易出bug!

简单来说,就是把具体的算法实现从业务逻辑中剥离出来,成为一系列的独立算法分类,策略模式就是把各个平等的具体实现进行抽象,封装成独立的算法类,就像不同的封禁类型对应不同的封禁操作,这时就需要一个封禁抽象类,其里面有一个封禁操作。
其实就是把逻辑中的if else判断提到调用者哪里,根据参数类型创建不同的上下文对象,不同的上下文对象继承同一个类,有着同样的抽象处理方法,但有很多实现类,调用时根据子类类型来调用不同的实现方法

如果参数类型比较多,可以再加上工厂模式,即if else在工厂中进行判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值