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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值