设计模式汇总

接口和抽象类的区别
  接口:  接口方法实现类要全部实现           
  抽象类:抽象方法子类必须重写,非抽象方法子类可重写也可不重写

B类要使用A类的方法:  
  方式1:继承  B类继承A类
  方式2:构造器   B类的成员变量是A类,构造方法的参数为A类        案例:类适配器和对象适配器
        setter方法
        作为方法参数传入


桥接(品牌样式手机)、装饰者(咖啡加作料)、组合(学校学院)好像呀

模板方法是模板制作豆浆定义四个步骤,再一个make方法给顺序起来,制作的时候直接调用模板的make方法
建造者模式也是盖房子三个步骤,再一个buildHouse给串起来
外观模式关闭家庭影院:是每个电器都有开,关,暂停方法。   要关闭或开启就在外观模式定义方法把各个电器的方法拿过来

git源码地址

一。七大原则介绍

1.单一职责    
2.接口隔离:Interface Segregation Principle  
3.依赖倒转
4.里氏替换   
5.开闭原则(OCP)     
6.迪米特法则
7.合成复用原则

1.单一职责原理:
     原始:交通工具类,里面一个run方法
     改善1:交通工具类根据天空  陆地  水里分成不同的类,每个类里面有一个run方法
     改善2:只有一个类,类里面根据天空  陆地  水里写run1  run2  run3方法

2.接口隔离原则:
   原始:一个接口有五个方法,B类,D类实现了接口的五个方法
         A类通过接口依赖B类,但是只调用B类的方法1 2 3
         C类通过接口依赖D类,但是只调用D类的方法1 4 5

   改善:接口改成三个接口  接口一有方法1  接口二有方法2 3   接口三有方法4 5B类实现接口一和接口二,D类实现接口一和接口三
         A类通过接口一,二依赖B类,调用B类的全部方法1 2 3
         B类通过接口一,三依赖D类,调用D类的全部方法1 4 5
          
3.依赖倒转原则:  
  案例:person类读消息(微信消息,邮件消息), 参数传入message接口,微信消息,邮件消息实现message接口
  
    1.中心思想是面向接口编程,应该一个类对另外一个类的依赖应该基于接口或抽象类,而不是具体的实现类   
    2.高层模块不应该依赖底层模块,二者都应该依赖其抽象
    3.抽象不应该依赖细节,细节应该依赖抽象
    4.依赖倒转原则基于这样的设计理念:
    			相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比细节为基础的架构要稳定的多
             在java中,抽象指的是接口或者抽象类,细节指的是实现类
    5.使用接口或抽象的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成    

   原始:persion类接收消息的方法,参数是Email类   syttem.out.println(email.getInfo())
   改善:1.定义一个接口,里面有一个getInfo()方法
        2.person类的参数由Email类改成接口
        3.Email类继承接口实现getInfo()方法,  如果有其他消息类型,如微信,只要再添加一个类继承接口即可
  
  依赖关系传递的三种方式:1.接口传递  2.构造方法传递  3.setter方式传递


4.里氏替换原则:
  B类要调用A类的方法,在B类声明属性A类,然后调用,而不让B类继承A类来调用A的方法
  
  继承在给程序带来便利的同时,也带了弊端:比如:A类(子类)继承了B类(父类),B类如果发生了修改,A类的功能就有可能发生故障
  在编程中如何正确的使用继承——里氏替换原则: 
      里氏替换原则告诉我们:继承实际上让两个类耦合性增强了,尽量不要在子类中重写父类的方法,
                       在适当的情况下,可以通过聚合,组合,依赖来解决问题
                       或者B类再抽出一个更base的类,让AB都继承这个base类,这样AB就不用重新base类的方法
                        
         
5.开闭原则
  对扩展开发(服务提供方可以扩展),对修改关闭(服务使用方不变)



6.迪米特法则
	一个对象应该对其他对象保持最少的了解,尽量降低类与类的耦合
 

二。23种设计模式

创建型(5)
	单例模式:某个类只能有一个实例,提供一个全局的访问点。
	工厂模式:将实例化对象的代码提取出来,放到一个类中统一管理和维护   简单工厂、工厂方法、抽象工厂三种工厂模式
	原型模式:通过复制现有的实例来创建新的实例。
	建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。
	

结构型(7)
	适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。
	组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。
	装饰模式:动态的给对象添加新的功能。
	代理模式:为其他对象提供一个代理以便控制这个对象的访问。
	亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。
	外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。
	桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。
 

行为型(11)
	模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。
	解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。
	策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。
	状态模式:允许一个对象在其对象内部状态改变时改变它的行为。
	观察者模式:对象间的一对多的依赖关系。
	备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
	中介者模式:用一个中介对象来封装一系列的对象交互。
	命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。
	访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。
	责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
	迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

一。单例模式

1.所谓单例设计模式,就是采取一定的方法保证在软件系统中
     1.对某个类只能存在一个对象实例,
     2.并且该类只提供一个取得该对象实例的方法(静态方法)

2.单例模式有8种方式,
   1.静态变量饿汉式    (内存浪费)
   2.静态代码块饿汉式  (内存浪费)
 
   3.懒汉式(线程不安全)
   4.懒汉式(线程安全,同步方法,但是效率太低)
   5.懒汉式(线程不安全,同步代码块)
 
   6.双重检查懒汉式    推荐
   7.静态内部类       推荐
   8.枚举            推荐

3.JDK源码
 RUNTIME

二。工厂模式

案例:创建不同类型的披萨

1、定义:专门创建对象的类
   将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦,从而提高项目的扩展和维护
   创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中并返回;

2.工厂模式有三种
    a.简单工厂:也叫静态工厂模式,属于创建型模式, 定义一个创建对象的类
          是工厂模式的一种,也是工厂模式家族中最简单使用的模式
          创建不同类型的披萨(添加一种披萨,只要修改工厂类一个文件就行,其他都不变)   SimpleFactory
        
        根据传入的披萨类型创建不同的披萨,在SimpleFactory里面if("chess") 创建“奶酪披萨”...else...


     b.工厂方法: 创建披萨的方法抽象化,由子类单独实现


     c.抽象工厂:从设计层面看,抽象工厂模式是对简单工厂模式的改进(或者说进一步的抽象)  抽象方法和接口一样的意思
         简单工厂是SimpleFactorycreatePizza(String pizzaType)
         抽象工厂是   AbsFactorycreatePizza(String pizzaType),client具体工厂


3.JDK源码: Calendar.getInstance————createCalendar————根据不同情况创建不同的Calendar
    

在这里插入图片描述

三。建造者模式

生活案例:A打地基、B砌墙、C封顶,D集合做指挥并代表他们盖房子

1.作用,用在什么地方
  答:指定建造房子的流程,先打地基然后砌墙最后封顶
2.建造者模式四个角色
  Product(产品角色)   Builder(抽象建造者)   ConcreteBuilder(具体建造者)  Director(指挥者)  ——有技术人员和指挥人员,指挥人员统一建造房子
 (传统模式只有抽象建造者和具体建造者)                                                   ——只有技术人员建造者
3.JDK源码 
  StringBulider

在这里插入图片描述
在这里插入图片描述

四。适配器模式

生活案例:手机充电器将220V转成5V给手机充电(已经有一个固定的220V,把它转变为我们需要的)

1.类适配器模式
1.作用(功能)
 将某个类的接口转换成客户端期望的另一个借口,目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(wrapper)
2.角色
  被适配器类(输出220V的类)  
  适配接口(提供转换方法)  
  适配器类(220V转成5V)    继承被适配器类 实现 适配接口
  Phone:充电
3.分类
  类适配器   对象适配器  接口适配器
4.JDK源码:Dispatcher
2.对象适配器模式

和类适配器类似,只是不继承了,改成拥有被适配器类的实例

3.接口适配器模式

使用场景:不想使用一个接口的所有方法
方法:1.写一个抽象类实现该接口,
2.调用者new出该抽象类实例并用匿名内部类实现需要的接口方法

五。原型模式(clone对象)

案例:克隆羊

简单的操作就是new 10只羊,缺点:每次需要重新获取原始对象的属性,如果创建的对象比较复杂效率低
改进思路:Object类是所有类的基类,它有一个clone方法; 
         实现clone方法的实现类必须实现cloneAble接口,该接口表示能够复制且具有复制的能力
        
浅拷贝和深拷贝的概念区别:浅拷贝只拷贝八种基本数据类型 + String,引用类型没有拷贝,而深拷贝引用类型也有拷贝

浅拷贝方法:(只拷贝八种基本数据类型 + String1.Sheep 类实现 Cloneable接口 并重写clone方法
 2.Client调用clone方法直接实现克隆 sheep.lone     
        Sheep sheep = new Sheep(1,"tom","white");
        Sheep sheep1 = (Sheep) sheep.clone();
        Sheep sheep2 = (Sheep) sheep.clone();

深拷贝实现方法:在Dto.java的两个方法
 方法1.实现cloneAble接口重写clone方法
 方法2.利用序列化(推荐这个,因为如果引用类型有多个,方法1就比较麻烦)             

六。桥接模式(品牌和样式组合成各种手机)

生活案例:手机的品牌和样式(一个完整的手机是有品牌 + 样式)

1.作用:手机品牌和类型组成完整的一个手机

2.角色:
   品牌接口——各种品牌实现类(小米、货位)—— 手机机抽象类(包含品牌)——各种手机

3.JDK源码: JDBC

七。装饰者模式(下单加减佐料计算价格)

生活案例:星巴克咖啡 点单加减佐料计算价格
一种用于代替继承的技术,无需通过继承增加子类就能扩展


装饰类:1.实现指定接口Drink(或者继承抽象类)
      2.把接口(或者抽象类)作为属性包进来


1.作用:点单加减佐料计算价格
2.角色:
                           2.coffe(继承drink)                        ————3 .写各种具体咖啡(继承coffe)  
      1.抽象饮料类drink——                         
                          2. decorator(继承drink,并且包含drink)      ————3. 写各种调味品(继承decorator)

3.JDK源码:IO类

test-mybatis里面也有代码案例 wangmeili

八。组合模式(也叫部分整体模式)

生活案例:学校——学院——系

1.作用
  学校有哪些学院,学院有哪些系  灵活添加与移除
  
2.角色
  OrganizationComponent————学校,学院,系 ———— client
  
3.JDK源码
  hashMap

九。外观模式(也叫过程模式)

生活案例:播放家庭影院,要开显示屏,DVD,音响等太麻烦,做成一键启动所有(即一个接口完成多个功能)

1.作用
  解决多个复杂接口带来的使用困难,简化用户的操作
2.角色
子系统(多个)——外观类——客户端
3.JDK源码
 mybatis
 mybatis的日志模块运用到了外观模式,mybatis对外提供一个接口以适应项目不同的日志框架

九。享元模式(也叫蝇量模式)

生活案例:前端展示要web,小程序,公众号这些是共享的,谁在使用是独特的


1.作用
  运用共享技术有效支持大量细粒度的对象,常用语系统底层开发(如连接池),解决重复对象浪费内存
2.角色
抽象网站类——独特类(User)——共享网站类——工厂类创建共享网站类——Client

3.源码
Integer

创建一个map存放website,要获取website直接从map取,map没有该type就新建再取,
<type,website>

十。代理模式

静态代理: 静态代理对象是直接new出来的
动态代理(JDK):动态代理对象是根据传入的目标对象动态创建出来的
Cglib代理,也叫子类代理(也属于动态代理,不需要目标对象实现接口,但是代理对象创建工厂实现MethodInterceptor接口)

1.作用
  实现目标对象的同时增强实现其他功能

2.角色
   静态代理:目标接口——实现类——代理对象—客户端
   动态代理:目标接口——实现类——代理对象创建工厂—客户端    实现invocationhandler类,重写invoke方法
   cglib代理          实现类——代理对象创建工厂—客户端    实现MethodInterceptor类,重写intercept方法
   
3.源码

十一。模板模式

生活案例:制作豆浆有四个步骤 :挑选黄豆,添加配料,浸泡,豆浆机旋转

钩子方法hook可以根据条件适当减步骤(父类有个默认,子类可以重写)

1.作用
     
2.角色
   抽象模板类——特色实现类(红豆绿豆)——客户端
   钩子方法:动态设定方法是否执行
3.源码
  IOC

十二。命令模式

生活案例:
1.将军下达命令,士兵进攻撤军 ;命令发送者不知道具体接收的士兵有哪些
2.家庭电器遥控器

1.作用
  将命令发布者和接受者进行解耦
  
2.角色
命令接受者 ———— 命令接口(执行 撤销) ———— 具体命令实现类 ———— 命令发布者 ———— 调用者client

3.源码
  JDBCTemplate源码

十三。访问者模式

生活案例:歌唱比赛 给歌手测评 (歌手可以扩展 测评结果也可以扩展)

有个双生派

1.作用
  扩展性很好,可以扩展action,也可以扩展person
2.角色
  a.评测抽象类 ——> 成功类  失败类
  b.人员抽象类 ——> 男人类  女人类
  c.数据结构类
  d.客户端

3.源码
  无

十四。迭代器模式

生活案例:迭代所有学院,学院迭代所有系(学院里面的系集合是不一样的,如list,数组)

1.作用
  传入一个list,这个list里面放多个不同类型的集合(可以是List  可以是数组),都可以遍历出来
  迭代器模式提供一种遍历集合的接口
  
2.角色
   学院bean:college接口 —— ComputerCollege  InfoCollege   (这边只是维护一个list一个数组,里面有多个系)加核心 创建一个迭代器
   系bean    department
   
   不同学院的迭代器       ComputerCollegeIterator  InfoCollegeIterator	
   输出工具              OutPutImpl:传入一个list,这个list里面放多个不同类型的集合(可以是List  可以是数组),都可以遍历出来
                      核心原因是遍历传入的list得到college,college有创建具体迭代器的方法,得到具体迭代器就相当于得到具体的集合(学院),就能在具体的集合继续遍历得到具体的系
   

Iterator,迭代器接口,是系统提供,含有hasNext,next,remove
ConcreteIterator:具体的迭代器类,管理迭代
Agreegate:一个统一的聚合接口,将客户端和具体聚合解耦
ConcreteAgreegate:具体的聚合持有对象集合,并提供一个方法可以返回一个迭代器,该迭代器可以正确遍历集合

3.源码
 ArrayList

十五。观察者模式

生活案例:气象站与多个网站,牛奶中心与多个用户(多方是观察者)

1.作用
气象站与各个网站,良好扩展网站,气象站不用变更,遵循了OCP原则(开闭) 

2.角色
   subject —— Weather
   observer —— 各个网站
   client
   
3.源码
   Observable模式
   
代码测试:1.添加网站 2.客户端注册网站到气象中心  3.运行

十六。中介者模式

1.作用
   用一个中介者对象来封装一系列的对象交互,减少子系统之间的耦合(智能家庭,各个电器之间的调用)
   
2.角色
meditor   ——> concreteMediator   中介者
colleague ——> Alarm TV CoffeMachine   家庭电器

3.源码 无

十七。备忘录模式

1.作用
   记录一个对象的状态或者某些数据,当要做恢复时可以从备忘录对象里面获取
2.角色
    游戏角色
    备忘录对象(memento)  —— 成员属性和游戏角色一样 
    守护者(caretaker) —— 保存备忘录对象
    客户端
3.源码  无

十八。解释器模式

1.作用

2.角色

3.功能

十九。委托模式

接口: 公司生产产品
实现类:  sun公司生产产品   oracle公司生产产品

boss:成员变量里面有公司, 直接让成员变量公司去生产产品

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘然生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值