简单几句话即可理解设计模式(更新ing)

目录

简单工厂模式

策略模式

装饰者模式

代理模式

工厂方法模式

原型模式 

模板方法模式

外观模式 

建造者模式 


在了解设计模式前我们需要了解的面向对象程序设计的一些原则

  • 设计原则
    • 单一职责原则
      • 就一个类而言,应该仅有一个引起它变化的原因;
    • 开放-封闭原则
      • 软件实体(类、模块、函数等)应该可以扩展,但是不可修改;面对需求,对程序的改动最好是通过增加新代码进行的,而不是更改现有的代码;
    • 依赖倒转原则
      • 抽象不应该依赖细节,细节应该依赖抽象;
      • 高层模块不应该依赖低层模块;两个都应该依赖抽象;
  • 迪米特法则(最小知识原则)
    • 如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用;如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用;强调了类之间的松耦合,类之间的耦合越低,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及;(个人感觉在定义一些工具类的时候能体现该原则)

简单工厂模式

  • 由于面向对象是为了实现三大特性:继承、封装、多态;而这个执行后会带来一个后果,就是由于继承扩展功能的类越来越多,而我们在编写代码的时候需要根据条件判断使用哪个类的时候就显得十分麻烦,因为我们需要去记住每个类名及所对应的功能;而简单工厂模式就是为了解决这一痛处:我们可以根据每个类的特点,由一个类工厂根据特点在底层自动给我们创建这个类,这样的话我们就可以利用多态自动获取我们所需要的对象;

策略模式

  • 它定义了算法家族(一系列的算法的方法),分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户,最后可以以相同的方式调用所有的算法,减少算法与使用算法之间的耦合;
  • 个人理解为多态的泛化,可以把同一类的方法或策略归纳起来,通过统一的context上下文类进行调用不同的策略,从而摆脱声明类和实际类耦合,不用通过大量的if-else进行判断创建;

装饰者模式

  • 装饰模式是为已有功能动态地添加更多功能的一种方式;当系统需要新功能的时候,我们以往会向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为;但是新加入的代码会增加主类的复杂性,显得代码十分臃肿且不好维护;而如果我们新加入的代码仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要的时候,这时候装饰模式就可以很好的解决问题,它可以把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象(就是作为属性),从而在执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象;有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑;

代理模式

  • 为其他对象提供一种代理以控制对这个对象的访问;通过根据被代理类抽象出公共接口,动态的创建一个代理类同时实现该接口,且在代理类中保存对被代理类的引用;这样当通过代理类的对象调用某个方法时就能动态地去调用被代理类中的同名方法;
  • 代理模式的应用
    • 远程代理
      • 为一个对象在不同的地址时空提供局部代表;
    • 虚拟代理
      • 浏览器通过虚拟代理来优化浏览;
    • 安全代理
      • 用来控制真实对象访问时的权限;
    • 智能指引
      • 当调用真实对象时,代理会同时去补充处理另一些事;

工厂方法模式

  • 简单工厂模式对于工厂方法模式来说最大的优点在于简单工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖;
  • 工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类;工厂方法使一个类的实例化延迟到其子类,在客户端根据不同子类调用不同方法;工厂方法模式是简单工厂模式的进一步抽象和推广;
  • 如果需要增加功能的话,简单工厂需要修改工厂类内部的判断逻辑,而工厂方法需要在客户端进行功能子类替换;

原型模式 

  • 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象;从一个对象再创建到另外一个可定制的对象,而且不需要知道任何创建的细节;
  • 浅复制vs深复制
    • 浅复制情况下,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象;
    • 深复制在浅复制基础上对被复制对象里的引用属性进一步封装拷贝,在外拷贝方法里进行内引用拷贝;

模板方法模式

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,将抽象父类中的不同实现的某些点提取出来封装为抽象方法,用不同的子类分别去实现这些点从而达到很好的代码复用作用;

外观模式 

  • 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子类更加容易使用;外观类需要了解所有的子系统的方法或属性,进行组合从而被外界调用;

建造者模式 

  • 将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示;这些复杂对象内部构建间的建造顺序通常是稳定的,如同流水线般,但各个部分具体实现面临着复杂变化,因此建造者模式可以既保证对象该构建的部分不出错不缺少,又可以实现构造的对象实现多样化;

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值