Java设计模式精讲—课程笔记5(第9章 原型模式 + 第10章 外观模式 + 第11章 装饰者模式)

9 原型模式讲解+Coding+源码解析

9.1 原型模式讲解

  1. 定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
    特点:不需要知道任何创建的细节,不调用构造函数;
    类型:创建型;
  2. 适用场景:
    类初始化消耗较多资源;
    new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等);
    构造函数比较复杂;
    循环体中生产大量对象时;
  3. 优点:
    原型模式性能比直接new一个对象性能高;
    简化创建过程;
  4. 缺点:
    必须配备克隆方法;(标识、重写克隆方法)
    对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险;
    深拷贝、浅拷贝要运用得当;
  5. 扩展:
    深克隆、浅克隆;

9.2 原型模式coding

  1. 原型模式:在内存中进行二进制流的拷贝
    类实现克隆功能:添加Cloneable接口,重写克隆方法clone(): Object;
    克隆时并未调用原构造器,只调用了克隆方法;
    在这里插入图片描述
    在这里插入图片描述
  2. 另一种方法:通过抽象类实现原型模式;
    A可克隆,B继承A后自然也可克隆;
    在这里插入图片描述
    在这里插入图片描述
  3. 浅克隆:只克隆当前层次,可能引用了同一个对象
    在这里插入图片描述
    在这里插入图片描述
  4. 深克隆:单独克隆引用对象
    在这里插入图片描述
    在这里插入图片描述

9.3 原型模式coding—克隆破坏单例

  1. 克隆模式可以破坏单例
    在这里插入图片描述
  2. 解决方法:单例类不实现克隆接口,或在克隆中直接实现getInstance() 方法。
    在这里插入图片描述

9.4 原型模式源码解析

  1. Object -> clone()
    在这里插入图片描述
  2. 写一个Cloneable接口,ctrl + T 能看到实现的接口
    在这里插入图片描述
  3. ArrayList、HashMap等
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 使用原型模式要注意对象是深克隆or浅克隆。

10 外观模式讲解+Coding+源码解析

10.1 外观模式讲解

  1. 定义:又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口;
    外观模式定义了一个高层接口,让子系统更容易使用;
    类型:结构型;
  2. 适用场景:
    子系统越来越复杂,增加外观模式提供简单调用接口;
    构建多层系统结构,利用外观对象作为每层的入口,简化层间调用;
  3. 优点:
    简化了调用过程,无需了解深入子系统,防止带来风险;
    减少系统依赖、松散耦合;、
    更好的划分访问层次;
    符合迪米特法则,即最少知道原则;
  4. 缺点:
    增加子系统、扩展子系统行为容易引入风险;
    不符合开闭原则(增加、扩展子系统时);
  5. 相关设计模式:
    外观模式和中介者模式(外观模式关注外界和子系统交互,中介者模式关注子系统内部之间的交互);
    外观模式和单例模式(通常将外观模式中的外观对象做成单例模式);
    外观模式和抽象工厂模式(外观类可通过抽象工厂获取子系统实例,从而使子系统在内部对外观类屏蔽)。

10.2 外观模式coding

  1. 对外部只和外观类通讯,不需关注子系统。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 实际使用时test可以只和外观类联系(此处由于未集成spring),可调整为
    在这里插入图片描述
  3. 标准外观类子系统UML:(应用层、子系统都只和外观类通信,不直接通信)
    在这里插入图片描述
  4. 此时并不符合开闭原则;
    还可通过抽象外观类实现(需频繁添加子系统时,可符合开闭原则);

10.3 外观模式源码解析(springjdbc+myabtis+tomcat)

  1. springjdbc :JdbcUtils
  2. myabtis :Configuration
  3. tomcat:RequestFacade

11 装饰者模式讲解+coding+源码解析

11.1 装饰者模式讲解

  1. 定义:在不改变原有对象的基础之上,将功能附加到对象上;
    提供了比继承更有弹性的替代方案(扩展原有对象功能);
    类型:结构型;
  2. 适用场景:
    扩展一个类的功能或给一个类添加附加职责;
    动态地给一个对象添加功能,这些功能可以再动态地撤销;
  3. 优点:
    继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能;
    通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果;
    符合开闭原则;
  4. 缺点:
    会出现更多的代码,更多的类,增加程序复杂性;
    动态装饰时,多层装饰时会更复杂;
  5. 相关设计模式:
    装饰者模式和代理模式(装饰者模式关注对象动态添加方法,代理模式关注控制对对象的访问)(代理模式常常在代理类中创建对象实例,装饰者模式通常会将原始对象作为参数传递给装饰者构造器);
    装饰者模式和适配器模式(都可以叫做包装模式,装饰者和被装饰者可以实现相同的接口或为子类,适配器和被适配的类可以实现不同的接口;装饰者模式可以退化为半装饰者);

11.2 装饰者模式coding

  1. 装饰者模式:抽象的实体类、具体的实体类、抽象的装饰类、具体的装饰类;
    在这里插入图片描述
    在这里插入图片描述
  2. 抽象的装饰者:如果能保证子类一定实现某方法,抽象的装饰者才有意义;
    根据实际需求确定是否需要抽象的装饰者;

11.3 装饰者模式源码解析(spring-session mybatis jdk servlet)

  1. java.io -> BufferedReader、BufferedInputStream
    在这里插入图片描述
    FilterInputStream:抽象装饰者;
    LineInputStream等:实体装饰者;
  2. spring -> TransactionAwareCacheDecorator
    Cache的装饰者;
  3. spring-session -> SessionRepositoryRequestWrapper
    在这里插入图片描述
  4. 装饰者和适配器都可称为包装器,结尾都可能是Wrapper,具体需看类内结构。
  5. mybatis -> Cache,decorators包
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值