源码专题之spring设计模式:策略模式、原型模式、模板模式

简介:

策略模式

返回值是固定的,中间逻辑不一样。例如从家出发去旅游,可以开车,做公交车,坐火车等。但是目的地是固定的。

阎宏博士的《JAVA与模式》一书中这样描述:中策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

如何到达目的地就是算法,开车、坐公交、坐火车等相当于对算法的封装,他们同属于一个范畴叫做出行方式,而出行人是算法的调用者,并且可以根据需求选择算法,这就是将算法和职责的分离。
image
这个模式涉及三个角色:
环境角色(Context):持有一个strategy的引用
抽象策略角色(Strategy):所有策略类的顶级父类或是接口,定义策略中的方法
具体策略角色(ConcreteStrategy):实现抽象策略中的方法,具体算法的实现者

代码示例:

List<Long> numbers = new ArrayList<Long>();
// todo 想list中添加内容
Collections.sort(numbers, new Comparator<Long>() {
    //返回值是固定的
    //0 、-1 、1
    //0 、 >0 、<0
    @Override
    public int compare(Long o1, Long o2) {
        //中间逻辑是不一样,泛型为Long、Object等比较方式不一样
        return 0;
    }
});

上面的例子中,Comparator就是策略的抽象,这里用了一个匿名内部类实现,而Collections.sort()方法测试集合工具类的一个职责——排序,而排序的逻辑由具体的策略来实现。

原型模式

首先要有一个原型,然后根据原型生成一个数据内容相同但是对象示例不同的实例,即两个完全不同的内存地址。孙悟空的变身术就是个很形象的例子。
对象拷贝时,类的构造函数是不会被执行,因为Object 类的 clone 方法的 原理是从内存中(具体的说就是堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那么构造函数也就没有被执行的必要了。

  • 浅度克隆:当被克隆的类中有引用对象(String或Integer等包装类型除外)时,克隆出来的类中的引用变量存储的还是之前的内存地址,也就是说克隆与被克隆的对象是同一个。这样的话两个对象共享了一个私有变量,所有人都可以改,是一个种非常不安全的方式,在实际项目中使用还是比较少的。
  • 深度克隆:可以重写clone方法,重新实现对象拷贝逻辑,例如字节码拷贝。注意:final 类型修饰的成员变量不能进行深度拷贝。以下是一个深度克隆的例子:
public Object clone(){
        //深度克隆
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            //return super.clone();//默认浅克隆,只克隆八大基本数据类型和String
            //序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            
            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            TheGreatestSage copy = (TheGreatestSage)ois.readObject();
            return copy;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally{
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

模板模式

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式。这里以泡制一杯饮料的例子来说明,茶和coffee的泡制流程是固定的,只是原料和辅料不一样
image

public abstract class Bevegrage {
    
    //不能被重写
    public final void create(){
        //1、把水烧开
        boilWater();
        //2、把杯子准备好、原材料放到杯中
        pourInCup();
        //3、用水冲泡
        brew();
        //4、添加辅料
        addCoundiments();
    }
    
    public abstract void pourInCup();
    
    public abstract void addCoundiments();
    
    
    public void brew(){
        System.out.println("将开水放入杯中进行冲泡");
    };
    
    public void boilWater(){
        System.out.println("烧开水,烧到100度可以起锅了");
    }
    
}
---
public class Coffee  extends Bevegrage{

    //原材料放到杯中
    public void pourInCup() {
        System.out.println("将咖啡倒入杯中");
    }

    //放辅料
    public void addCoundiments() {
        System.out.println("添加牛奶和糖");
    }

}
---
public class Tea extends Bevegrage{

    //原材料放到杯中
    public void pourInCup() {
        System.out.println("将茶叶放入杯中");
    }

    //放辅料
    public void addCoundiments() {
        System.out.println("添加蜂蜜");
    }

}

SpringJDBC就是模板模式的一个应用,jdbc是一个规范,由数据库厂商自己去实现

  1. 加载驱动类DriverManager
  2. 建立连接
  3. 创建语句集(标准语句集、预处理语句集)(语句集? MySQL、Oracle、SQLServer、Access)
  4. 执行语句集
  5. 结果集ResultSet 游标
相关文章
|
4天前
|
JavaScript Java 关系型数据库
自主版权的Java诊所管理系统源码,采用Vue 2、Spring Boot等技术栈,支持二次开发
这是一个自主版权的Java诊所管理系统源码,支持二次开发。采用Vue 2、Spring Boot等技术栈,涵盖患者管理、医生管理、门诊管理、药店管理、药品管理、收费管理、医保管理、报表统计及病历电子化等功能模块。
|
6天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
16 3
|
7天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
19 2
|
8天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
28 3
|
10天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
9天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
21 3
|
10天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
8天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
11 1
|
9天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
13 2
|
4天前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式