ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring学习03-Spring中的设计模式(二)

2021-09-21 20:02:28  阅读:176  来源: 互联网

标签:03 对象 Spring void int 拷贝 设计模式 适配器 public


Spring学习03-Spring中的设计模式(二)

1.1 适配器模式(Adapter Pattern)

适配器模式是指将一个类的接口转换成用户期望的另一个接口,使原本接口不兼容的类可一起工作,属于结构型设计模式。

适配器模式适用于一下几种业务场景:

(1)已存在的类的方法和需求不匹配(方法结果相同或相似)的情况

(2)由于不同产品、不同厂家造成的功能类似而接口不同的问题解决方案

Instance

在中国,民用电都是220V交流电,但手机锂电池使用的是5V直流电,因此我们给手机充电就需要电源适配器转换。

我们来模拟该场景,先创建一个AC220类表示输出的220V交流电

public class AC220 {
    public int outputAC220V(){
        int output = 220;
        System.out.println("输出交流电"+output+"V");
        return  output;
    }
}

创建一个输出直流5V的手机厂商的标准,每个手机适配器都要输出直流5V,实现接口。

public interface DC5 {
    int outputDC5V();
}
public class PowerAdapter implements DC5{
    private AC220 ac220;
    public PowerAdapter(AC220 ac220){
        this.ac220 = ac220;
    }

    @Override
    public int outputDC5V() {
        int adapterInput = ac220.outputAC220V();
        //变压
        int adapterOutput = transform(adapterInput);
        System.out.println("适配器将电压从"+adapterInput+"变为"+adapterOutput);
        return adapterOutput;
    }
    private int transform (int intput){
        return 5;
    }
}

客户端代码

    public static void main(String[] args) {
        DC5 dc5 = new PowerAdapter(new AC220());
        int output = dc5.outputDC5V(); // 5
    }
//输出交流电220V
//适配器将电压从220变为5

简单的来说,适配器就相当于一个中间件,使两边连接起来。

1.2 观察者模式 (Observer Pattern)

观察者模式定义了对象之间的一对多的依赖,让多个观察者同时监听一个主体对象,当主题对象发生变化时,它的所有依赖者都会收到通知并跟新。

Instance

假设场景,在晚自修的时候,张三和李四老师需要管理整个班级,当有同学有问题时,老师需要解答同学的问题,所以班级一旦有新的变化,站三和李四都要收到消息,他们就是班级的观察者。

先定义了老师接口

public interface Teacher {
    void answer();
}
public class Classroom {
    private List<Teacher> observers = new ArrayList<Teacher>();

    private boolean ifQuestion = false; //表示班级是否有学生有问题

    public void setIfQuestion(boolean ifQuestion) { //如果有学生有问题就通知所有的老师来解答问题。
        this.ifQuestion = ifQuestion;
        if (ifQuestion) notifyAllObservers();
        ifQuestion = false;
    }

    public void attach(Teacher observer){
        observers.add(observer);
    }
    public void notifyAllObservers(){
        for (Teacher observer : observers) {
            observer.answer();
        }
    }
}
public class Wangwu implements Teacher{
    @Override
    public void answer() {
        System.out.println("王五来解答问题了");
        
    }
}
public class Zhangsan implements Teacher{
    @Override
    public void answer() {
        System.out.println("张三来解答问题了");
    }
}
public class Lisi implements Teacher{
    @Override
    public void answer() {
        System.out.println("李四来解答问题了");
    }
}

这里定义了三个观察者。

public static void main(String[] args) {
    Classroom classroom = new Classroom();
    classroom.attach(new Zhangsan());
    classroom.attach(new Lisi());
    classroom.attach(new Wangwu());
    classroom.setIfQuestion(true);
}
//张三来解答问题了
//李四来解答问题了
//王五来解答问题了

简单的来说,就是在被观察中增加观察者的依赖,每当被观察者发生改变就调用观察者中的方法,没啥东西。

1.3 原型模式(Prototype Pattern)

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

说白了就是实现Cloneable 接口,使用clone()来创建对象。

JAVA对象拷贝分为两种方式,一种是引用拷贝,一种是对象拷贝

引用拷贝:和对象拷贝的不同之处在于,引用拷贝只会生成一个新的对象引用地址,但两个地址其最终指向的还是同一个对象;

对象拷贝:这种方式会重新生成一个新的对象,生成的新对象与原来的对象没有任何关联。

浅拷贝与引用拷贝不同,被浅拷贝的对象是会重新生成一个新的对象,新的对象和原来的对象是没有任何关系的,但是如果对象中的某个属性是引用类型的话,那么该属性对应的对象是不会重新生成的,浅拷贝只会重新当前拷贝的对象,并不会重新生成其属性引用的对象。

在这里插入图片描述

Figure1:https://www.zhihu.com/people/yan-bang-fei/collections

深拷贝相比浅拷贝的不同就是,深拷贝会把拷贝的对象和其属性引用的对象都重新生成新的对象。

在这里插入图片描述

Figure2:https://www.zhihu.com/people/yan-bang-fei/collections

到此Spring主要的设计模式也都讲完了,终于可以开始正式使用的Spring了。

MVC设计模式将会在SpringMVC中讲!

Reference

主要材料《Spring 5核心原理与30个类手写实战》

https://www.runoob.com/design-pattern/prototype-pattern.html

标签:03,对象,Spring,void,int,拷贝,设计模式,适配器,public
来源: https://blog.csdn.net/m0_51188561/article/details/120404741

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有