接口和抽象类的区别
接口: 接口方法实现类要全部实现
抽象类:抽象方法子类必须重写,非抽象方法子类可重写也可不重写
B类要使用A类的方法:
方式1:继承 B类继承A类
方式2:构造器 B类的成员变量是A类,构造方法的参数为A类 案例:类适配器和对象适配器
setter方法
作为方法参数传入
桥接(品牌样式手机)、装饰者(咖啡加作料)、组合(学校学院)好像呀
模板方法是模板制作豆浆定义四个步骤,再一个make方法给顺序起来,制作的时候直接调用模板的make方法
建造者模式也是盖房子三个步骤,再一个buildHouse给串起来
外观模式关闭家庭影院:是每个电器都有开,关,暂停方法。 要关闭或开启就在外观模式定义方法把各个电器的方法拿过来
一。七大原则介绍
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 5,B类实现接口一和接口二,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的类,让A和B都继承这个base类,这样A和B就不用重新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.抽象工厂:从设计层面看,抽象工厂模式是对简单工厂模式的改进(或者说进一步的抽象) 抽象方法和接口一样的意思
简单工厂是SimpleFactory的createPizza(String pizzaType)
抽象工厂是 AbsFactory的createPizza(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,引用类型没有拷贝,而深拷贝引用类型也有拷贝
浅拷贝方法:(只拷贝八种基本数据类型 + String)
1.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:成员变量里面有公司, 直接让成员变量公司去生产产品