学习视频来源:www.bilibili.com/video/BV1Qx…
UML图 关联和依赖的区别 关联:(一个类是一个类的属性) 依赖:(一个类的方法中会用到另外一个类,只是传参)
工厂方法模式
一个工厂只生产一种产品,容易类爆炸
抽象工厂方式模式
一个工厂可以生产多种产品,一个产品组(系列)
原型模式
定义:允许一个对象通过拷贝原型对象再创建一个可定制的对象,无需关心创建细节
背景:填周报时,姓名等其他信息每周是重复的,只想填改变的部分。
实现方法:
让目标类实现clonable接口,重写clone()方法(接口里没有抽象方法,只是标记接口,clone方法是本地方法(C语言),复制出来和原对象地址不同,但注意是浅拷贝,需要修改关联对象的clone或者使用序列化和反序列化(ByteArray的输入输出流存内存)出来一个副本)并且为 public xxx clone(),否则无法调用。
这样克隆出一个新对象,但不会引起构造器的调用。
小延伸:创建对象的四种方式:类反射、new、clone、反序列化
建造者模式
背景:
客户去买电脑(有低配、中配、高配三中配置)
1.电脑类
2.建造者接口
3.不同建造者类实习建造者接口并重写建造方法(保证所有方法实现)
4.指挥者调用不同建造者完成建造
5.客户告诉指挥者需求
优点
- 创建对象的过程稳定(builder接口)
- 创建对象的过程只写了一次(指挥者完成)
- 当需要扩展指挥者时,不需要修改指挥者代码,只需要增加需求类(比如中高配的builder类),符合开闭原则
建造者和工厂模式的区别: 工厂模式只需要简单的New出产品即可,建造者模式在new出后还关注为产品各个属性赋值的过程。
建造者模式UML图
因为Director返回了Computer,所以也是依赖关系
装饰器模式
定义:创建装饰类包装原有的类,提供额外的功能 关键: 装饰器既继承被装饰的也关联被装饰的 业务场景:星巴克的各种饮料,并且可以往饮料中加入配料
- 饮料父类
- 具体饮料继承饮料父类
3. 调料父类继承、关联饮料父类
// Protected 为了子类能用
-
具体调料继承调料父类
-
执行
- UML图
- 常用到的:流就是一种装饰器模式
Input 是从文件读取到内存程序
8.优缺点:
8.1 优点:
- 加入新的装饰不违反开闭原则
- 加入新的被装饰物也不违法开闭原则
8.2 缺点:
- 类虽然没用爆炸,还是有点多
模板方法模式
模板即使用抽象类,不变的放入模板写死,用户可以重写抽象类的code部分,剩余是父类模板里的模板方法,调用模板的模板方法,先返回模板找到template,其中的code会回到new的类。
注意:子类只能改变细节,不能决定顺序
比如JDBC
{
开连接
//增删查改
关连接
}
再如泡茶、泡咖啡,烧水、倒水、晾凉是不变的,写到模板里,其他的写入子类让子类实现。
package MethodPattern.Template;
// 模板方法模式,不变的进模板写,变的在模板里只声明,到子类里具体实现
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.sql.SQLOutput;
abstract class DrinkTemplate {
public void drinkTemplate() throws InterruptedException {
System.out.println("烧水....");
Thread.currentThread().sleep(1000);
code1();
System.out.println("吹一吹....");
code2();
}
public void code1() {};
public void code2() {};
}
// 品茶
class DrinkTea extends DrinkTemplate{
@Override
public void code1() {
System.out.println("杯子里放茶叶");
System.out.println("杯子里倒开水");
}
@Override
public void code2() {
System.out.println("这茶真香真不错");
}
}
class DrinkCoffee extends DrinkTemplate{
@Override
public void code1() {
System.out.println("杯子里放速溶咖啡粉");
System.out.println("杯子里倒开水");
System.out.println("搅一搅");
}
@Override
public void code2() {
System.out.println("这咖啡真香真提神");
}
}
public class TemplateMethod {
public static void main(String[] args) throws InterruptedException {
DrinkTemplate drinkTea = new DrinkTea();
DrinkTemplate drinkCoffee = new DrinkCoffee();
drinkTea.drinkTemplate();
Thread.currentThread().sleep(1000);
drinkCoffee.drinkTemplate();
}
}
结果:
烧水....
杯子里放茶叶
杯子里倒开水
吹一吹....
这茶真香真不错
烧水....
杯子里放速溶咖啡粉
杯子里倒开水
搅一搅
吹一吹....
这咖啡真香真提神
观察者模式
subject 和 observer相互依赖
各类报纸、公众号实现subject 可以增删用户、通知用户
订阅的用户实现observer
好处:可以增删用户,增加订阅取消订阅,而不违反开闭原则
适配器模式
- 类1 和 类2, 接口(特殊方法)
- 类1 继承类2,实现特殊方法(调用类2的方法)
- 或者类1 委派 类2的对象,调用对象的方法
- 根据已有的接口,生成想要的接口 为什么 ?
如果一个方法的参数是类,那么只能传这个类以及其子类,传其他的(没继承这个类,但可能继承了其它类,不能再继承了)就出错了。 但是接口就可以多继承
- 例子:将Enumration 写个EnumrationAdapter继承iterator就可以,则枚举也有itrator 就是这个adapter
代理模式
www.cnblogs.com/WindSun/p/1…
一个类1关联一个类2,都继承主类(主类有共同方法)
类1的构造方法创建类2,调用共同方法,即代理调用类2的方法
在类2的方法上增强,不改变类2