设计模式学习

本文深入讲解了单例模式、适配器模式、观察者模式及代理模式等设计模式的实现方式与应用场景。单例模式确保类只有一个实例,并提供全局访问点;适配器模式将不兼容接口转换为所需形式;观察者模式建立对象间一对多依赖关系;代理模式通过代理对象处理复杂任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式

饿汉式:

package designPatterns;/**
 * Created by fangjiejie on 2020/9/9.
 */

/**
 * @author : liyafang
 * @description :单例模式
 * @date : 2020-09-09 19:30
 */
public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){

    }

    /**
     * 双重锁机制
     * https://www.cnblogs.com/qifenghao/p/8986538.html
     * @return
     */
    public static Singleton getInstance(){
        if(instance == null){//使用volatile关键字避免并发情况下线程阻塞
            synchronized(Singleton.class){
                if(instance == null){//判断instance是否已经被创建
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

适配器模式

把一个接口转换成用户希望的另一个接口,把不兼容的兼容起来

package designPatterns;/**
 * Created by fangjiejie on 2020/9/17.
 */

/**
 * @author : liyafang
 * @description : 适配器模式
 * @date : 2020-09-17 10:18
 */
//把风力发电转化为光源发电
public class AdapterDesignPattern {
    public static void main(String[] args) {
        SunSourceApply sunSourceApply = new SunSourceApply();
        WindSourceApply windSource = new WindSourceApply(sunSourceApply);
        windSource.windApply();
    }
}
interface SunSource{
    void sunApply();
}

interface WindSource{
    void windApply();
}

class WindSourceApply implements WindSource{
    SunSource sunSource;
    public WindSourceApply(SunSource sunSource){
        this.sunSource = sunSource;
    }
    public void windApply(){
        System.out.println("call windApply");
        sunSource.sunApply();
    }
}

class SunSourceApply implements SunSource{
    public void sunApply(){
        System.out.println("in sunSource applying");
    }
}

观察者模式

定义对象之间的一对多依赖,当一个对象状态发生改变时,它的所有依赖都会收到通知并自动更新状态。主题是被观察者的对象,而其所有依赖者被称为观察者。如天气通知
主题: 注册、移除、通知所有观察者。维护一张观察者列表。定义接口,实现
观察者:定义接口(被通知的更新方法),实现。构造函数中,将主题传进来,注册上自己

package designPatterns;/**
 * Created by fangjiejie on 2020/9/17.
 */


import java.util.LinkedList;
import java.util.List;

/**
 * @author : liyafang
 * @description : 观察者模式
 * @date : 2020-09-17 09:24
 */
public class ObserverDesignPattern {

    public static void main(String[] args) {
        WeatherSubject weatherSubject = new WeatherSubject();
        BoardDisplay1 boardDisplay1 = new BoardDisplay1(weatherSubject);
        BoardDisplay2 boardDisplay2 = new BoardDisplay2(weatherSubject);
        weatherSubject.setData(0.11,0.12);
        weatherSubject.notifyObservers();
        weatherSubject.setData(0.81,0.82);
        weatherSubject.notifyObservers();
    }

}
interface Subject{
    void register(ObserverDisplay obj);
    void remove(ObserverDisplay obj);
    void notifyObservers();
}
class WeatherSubject implements Subject{
    private List<ObserverDisplay> list = new LinkedList<>();
    private Double num1;
    private Double num2;
    public void setData(Double num1,Double num2){
        this.num1 = num1;
        this.num2 = num2;
    }
    @Override
    public void register(ObserverDisplay object){
        list.add(object);
    }

    @Override
    public void remove(ObserverDisplay object){
        int index = list.indexOf(object);
        if(index >=0 ){
            list.remove(index);
        }
    }

    @Override
    public void notifyObservers(){
        list.stream().forEach(e->e.update(num1,num2));
    }
}

interface ObserverDisplay{
       void update(Double num1,Double num2);
}

class BoardDisplay1 implements ObserverDisplay{
    public BoardDisplay1(Subject subject){
        subject.register(this);
    }
    public void update(Double num1,Double num2){
        System.out.println("BoardDisplay1 update:"+num1 +" "+ num2);
    }
}
class BoardDisplay2 implements ObserverDisplay{
    public BoardDisplay2(Subject subject){
        subject.register(this);
    }
    public void update(Double num1,Double num2){
        System.out.println("BoardDisplay2 update:"+num1 +" "+ num2);
    }
}

代理模式

静态代理
代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,由代理对象来处理繁杂的事情,这在个过程中会去访问被代理对象。
如果接口改了,代理对象内部的方法也要跟着改。代理对象和目标对象实现同样的接口,代理类会很多,不易维护。
动态代理
拦截直接访问对象,可以给对象进行增强的一项技能;代理对象的生成,是利用JDKAPI, 动态地在内存中构建代理对象
jdk动态代理:其代理对象必须是某个接口的实现,通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
cglib动态代理:针对没有实现接口的类产生代理,实现原理类似于 jdk 动态代理,只是他在运行期间生成的代理对象是针对目标类扩展的子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值