23种设计模式笔记

  • 创建型模式,

    • 简单工厂模式 simple factory
    • 工厂方法模式 factory
    • 抽象工厂模式 abstract factory
    • 单例模式
    • 建造者模式
    • 原型模式 prototype
  • 结构型模式

    • 适配器模式
      • 扩展类 增强类
    • 装饰器模式
      • 增强类
    • 代理模式
      • 静态代理就是 装饰者模式
    • 外观模式
      • 也叫门面模式 系统种存在特别复杂的业务 需要业务自己调用很多接口,此时门面模式整合这些接口 对外暴露出一个service
      • facade
      • 类似网关 对前端暴露一个域名就够了
      • 已有的资源封装起来 只留下一个方法
    • 桥接模式
    • 组合模式
      • 类引用类都叫组合
    • 享元模式
      • 池化技术核心模式
      • 共享数据及状态变更的操作
  • 行为型模式,共十一种

    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代模式
    • 责任链模式
    • 命令模式
    • 备忘录模式
      • 就是保存初始数据信息,以便备份
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式

单例模式


/**
* 懒加载单例模式
*/
public class LazySinglton {

   private static LazySinglton instance;
   private LazySinglton() {

   }
   public static LazySinglton getInstance() {
       if(instance == null) {
           instance = new LazySinglton();
       }
       return instance;
   }
}


/**
* 预加载单例
*/
public class PreSingleton {

   private static PreSingleton instance = new PreSingleton();
   private PreSingleton() {

   }
   public static PreSingleton getInstance() {
       return instance;
   }
}

工厂模式

简单工厂模式
  • 核心就是TransportFactory 方法根据类型获取对象
  • 缺点 产品族单一
public abstract class Transport {

    protected  String sing;

    public abstract void run();


    public void say(){
        System.out.println("运输方式的叫声" + sing);
    }


}

public class Car extends Transport{

    public Car(){
        this.sing = "小汽车 喀喀喀";
    }
    @Override
    public void run() {
        System.out.println("陆地上跑的 80迈");
    }
}

public class Lv extends Transport{

    public Lv(){
        this.sing = "小毛驴 儿啊儿啊";
    }
    @Override
    public void run() {
        System.out.println("陆地上四脚跑的 20迈");
    }
}

public class TransportFactory {

    public static Transport createTransport(String type){
        if("car".equals(type)){
            return  new Car();
        }else if("lv".equals(type)){
            return  new Lv();
        }
        return null;
    }
}

模板方法工厂模式
  • 从简单工厂上 提升一下产品族 把要生产的对象 变成抽象的
public abstract class Transport1 {
    protected  String sing;
    public abstract void run();
    public void say(){
        System.out.println("运输方式的叫声" + sing);
    }
}

public class Lv1 extends Transport1 {

    public Lv1(){
        this.sing = "小毛驴 儿啊儿啊";
    }
    @Override
    public void run() {
        System.out.println("陆地上四脚跑的 20迈");
    }
}

public class Car1 extends Transport1 {

    public Car1(){
        this.sing = "小汽车 喀喀喀";
    }
    @Override
    public void run() {
        System.out.println("陆地上跑的 80迈");
    }
}
public abstract  class AbstractTransportFactory {

    public abstract Transport1 createTransport();
}

public class BenZiCarFactory extends AbstractTransportFactory {
    @Override
    public Transport1 createTransport() {
        return new Car1();
    }
}
抽象工厂
  • 针对可扩展品类 再次提升一个档次 不需要实现的工厂默认实现为null
  • 需要实现的子类自己实现
public abstract class AbstractFactory {
    abstract Transport1  createTransport();
    abstract MakeMoney makeMoney();
}

public abstract  class AbstractTransportFactory extends AbstractFactory{
    @Override
    MakeMoney makeMoney() {
        return null;
    }
}

原型模式

  • 最核心就是clone 不需要单独创建对象
  • 而且改变原型类不会改变对象本身
@Data
public class Animal implements Cloneable {
    private String name;
    private String type;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class DB {


    public Animal select() throws CloneNotSupportedException {
        Animal animal = new Animal();
        animal.setName("狸花猫");
        animal.setType("小猫咪");
        return (Animal)animal.clone();
    }
}

public class DbPrototypeMain {
    public static void main(String[] args) throws CloneNotSupportedException {
        DB db = new DB();
        Animal select = db.select();

        select.setName("猫咪的徒弟");
        select.setType("老虎");
        System.out.println(select);

        Animal select1 = db.select();
        System.out.println(select1);
    }
}

代理模式

JDK代理
  • 只能代理有接口的类

public interface JdkInterface {
    void sayHello();
}

public class JdkImpl implements JdkInterface{
    @Override
    public void sayHello() {
        System.out.println("he ll o wo r l d");
    }
}



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class JdkProxy implements InvocationHandler {
    private Object target;
    JdkProxy(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}
CGLIB代理
  • Enhancer 类增强器
  • 可以代理没有接口的普通对象
public class CglibClass {
    void sayHello() {
        System.out.println("cglib hello world");
    }
}

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
public class CglibInvocatonHandler {
    public  static<T> T createProxy(T t){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(t.getClass());
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return method.invoke(t, args);
            }
        });
        return (T)enhancer.create();
    }
}

public class CglibProxy {
    public static void main(String[] args) {
        CglibClass cglibClass = new CglibClass();
        CglibClass proxy = CglibInvocatonHandler.createProxy(cglibClass);
        System.out.println(proxy.getClass().getSimpleName());
        proxy.sayHello();
    }
}

享元模式

  • 池化技术的核心
  • 对象本身有需要改变的状态,及不可变的因素 可用享元模式 进行剥离拆分
public interface WebSit {
     void use(User user);
}

public class ConWebsit implements WebSit {
    private String type;
    public ConWebsit(String type) {
        this.type = type;
    }
    @Override
    public void use(User user) {
        System.out.println(user.name + "使用" + type + "网站");
    }
}
public class User {
    String name;
}


public class WebFactory {
    Map<String,WebSit> pool = new HashMap<String,WebSit>();
    public WebSit getWebSit(String type){
        if(pool.get(type) != null){
            return pool.get(type);
        }
        WebSit webSit = new ConWebsit(type);
        pool.put(type,webSit);
        return webSit;
    }
}


public class FlyMain {
    public static void main(String[] args) {

        WebFactory webFactory = new WebFactory();
        WebSit webSit = webFactory.getWebSit("新闻网");
        User user = new User();
        user.name = "张三";
        webSit.use(user);

        WebSit webSit1 = webFactory.getWebSit("新闻网");
        User user1 = new User();
        user1.name = "里斯";
        webSit.use(user1);

        System.out.println(webSit == webSit1);
    }
}

适配器模式

  • 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
  • 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
  • 举个真实的例子,播放器最开始只能播放 mp3 格式的音频文件,通过使用一个更高级的音频播放器来播放其他格式的音频。
  • 适配器模式属于结构型模式。
  • 适配者类:MediaPlayer Mp3MediaPlayerImpl 现在想提升这个功能使用 MP4或clv
  • 适配器类 AdvancedAdapter
  • 目标类:AdvancedMediaPlayer Mp4MediaPlayerImpl 和 ClvMediaPlayerImpl 满足MP4和clv

public interface MediaPlayer {
   void play(String audioType, String fileName);
}
public class Mp3MediaPlayerImpl implements MediaPlayer {
    @Override
    public void play(String audioType, String fileName) {
        System.out.println("map3 播放器播放mp3文件");
    }
}


public interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

public class ClvMediaPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("vlc 播放器播放vlc文件");
    }
    @Override
    public void playMp4(String fileName) {
    }
}

public class Mp4MediaPlayer implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
    }
    public void playMp4(String fileName) {
        System.out.println("mp4 播放器播放mp4文件");
    }
}


public class AdvancedAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedMediaPlayer;
    private Mp3MediaPlayerImpl mp3MediaPlayer;

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new ClvMediaPlayer();
            advancedMediaPlayer.playVlc(fileName);
        }else if(audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4MediaPlayer();
            advancedMediaPlayer.playMp4(fileName);
        }else {
            mp3MediaPlayer.play(audioType, fileName);
        }
    }
}

责任链模式

  • next自己是核心 这个可以抽象 统一类产品组

@Data
@ToString
public class Teacher {

    private String name;

    private Teacher next;
    public Teacher(String name) {
        this.name = name;
    }

    public void handlerRequest(){
        System.out.println(this.name+"处理了");
        if(next!=null){
            next.handlerRequest();
        }
    }
}

public class ChainMain {

    public static void main(String[] args) {
        Teacher teacher1 = new Teacher("张三");
        Teacher teacher2 = new Teacher("李四");
        Teacher teacher3 = new Teacher("王五");

        teacher1.setNext(teacher2);
        teacher2.setNext(teacher3);

        teacher1.handlerRequest();
    }
}

建造者模式

  • 例子写的不太清晰
  • 建造者针对的是都不是必填的字段
  • 优势就是构造对象时候清晰


public abstract class ZaoFangZi {

    int zhuanNum;

    int dijiNum;

    int fangliangNum;

    int baowenNum;

    abstract ZaoFangZi zhuan();

    abstract ZaoFangZi diji();

    abstract ZaoFangZi fangliang();

    abstract ZaoFangZi baowen();

    public int sum(){
        return fangliangNum + baowenNum + dijiNum + zhuanNum;
    }


}


public class BaoGongTou extends ZaoFangZi {

    private static BaoGongTou instance;

    public static BaoGongTou builder() {
        instance = new BaoGongTou();
        return instance;
    }

    public static BaoGongTou build() {
        return instance;
    }


    @Override
    ZaoFangZi zhuan() {
        this.zhuanNum = 100;
        return this;
    }

    @Override
    ZaoFangZi diji() {
        this.dijiNum = 200;
        return this;
    }

    @Override
    ZaoFangZi fangliang() {
        this.fangliangNum = 300;
        return this;
    }

    @Override
    ZaoFangZi baowen() {
        this.baowenNum = 400;
        return this;
    }
}
public class BuilderMain {
    public static void main(String[] args) {
        ZaoFangZi zaoFangZi = BaoGongTou.builder().zhuan().baowen().diji().fangliang();
        System.out.println(zaoFangZi.sum());
    }
}

访问者模式

  • 不太符合开闭原则

  • 角色

    • 元素(Element)
    • 访问者(Visitor)
    • 对象结构(Object Structure)
    • 具体元素(Concrete Element)
    • 具体访问者(Concrete Visitor)
  • 需求 家里有小动物,需要有人投喂

    • 元素 animal 小动物抽象类 以后家里可能有 猫 狗 鱼 鹅
    • 具体元素 dog,cat 具体的小动物
    • 对象结构 home 家里有人 喂食小动物
    • 访问者 Person 主人 其他人
    • 具体访问者 owner someone
  • 雷神讲的 小爱同学的例子 小爱同学可以简单的回答问题,存储磁盘,需要打个补丁,进行升级

    • 元素 硬件
    • 具体元素 CPU 内存 硬盘
    • 对象结构 有人访问硬件问问题
    • 访问者 增强器
    • 具体的访问者 updatPack
  • 问题

    • 如果按照雷神写得 是具体工作类 那没多一个具体元素 就会违背开闭原则
    • 如果按照自己写的抽象类访问,就不会知道要为哪个具体类进行增强 只会统一增强
public abstract class HardWare {
    String commond ;
    public abstract void work();
    abstract void action (Visitor visitor) ;
}

public class CPU extends HardWare {

    @Override
    public void work() {
        System.out.println("cpu 开始工作");
    }

    @Override
    void action(Visitor visitor) {
        visitor.visitor(this);
    }

public class Disk extends HardWare {

    @Override
    public void work() {
        System.out.println("disk 开始工作");
    }
    @Override
    void action(Visitor visitor) {
        visitor.visitor(this);
    }
}

public class UpdatePkg implements Visitor{


    @Override
    public void visitor(HardWare hardWare) {
        hardWare.work();
        System.out.println("更新包打补丁 我开始联网处理了");
    }
}

public interface Visitor {


    void visitor(HardWare hardWare);
}

观察者模式

  • 非常常见的一种设计模式
  • 主要是维护一对多的关系(也可以相互关联)
  • 例子 主播 与 粉丝
public abstract class ZhuBo {
    String name;
    abstract  void addFans(Fans fans);
    abstract  void notify(String msg);
}
public class LeijiaYin extends ZhuBo {
	//核心点就是这个list 及通知方法
    List<Fans> fansList = new ArrayList<Fans>();
    LeijiaYin(String name) {
        this.name = name;
    }
    @Override
    void addFans(Fans fans) {
        fansList.add(fans);
    }
    @Override
    void notify(String msg) {
        for (Fans fans : fansList) {
            fans.accept(msg);
        }
    }
}
public abstract class Fans {

    abstract void accept(String msg);
}
public class MmFans extends Fans {
    ZhuBo zhuBo;

    MmFans(ZhuBo zhuBo) {
        this.zhuBo = zhuBo;
    }

    @Override
    void accept(String msg) {
        System.out.println("mmFans 接收到主播" + zhuBo.name + "消息 " + msg);
    }
}
public class ObserverMain {

    public static void main(String[] args) {
        ZhuBo zhuBo = new LeijiaYin("雷佳音");
        zhuBo.addFans(new MmFans(zhuBo));
        zhuBo.addFans(new MmFans(zhuBo));
        zhuBo.addFans(new MmFans(zhuBo));
        zhuBo.notify("我要开始跳舞了");
    }
}

中介者模式

  • 模拟飞机起飞的流程 跑道只能有一架飞机起飞
  • 中介者模式就是把散乱的交互统一起来 逻辑都放在一起 统一维护
//塔台
public class Tower {
    private boolean canFly = true;
    public void action(AbstractPlane plane, String action) {
        if (action.equals("fly")) {
            if (canFly) {
                canFly = false;
                System.out.println(plane.getClass().getSimpleName() + " 起飞");
            }else {
                System.out.println(plane.getClass().getSimpleName() + " 飞机太多,不能起飞");
            }
        }
        if (action.equals("flow")) {
            canFly = true;
        }

    }
}


public abstract class AbstractPlane {
    Tower tower;
    AbstracPlane(Tower tower) {
        this.tower = tower;
    }
    abstract void fly();
    abstract  void flow();
}

public class Plane1 extends AbstractPlane {

    Plane1(Tower tower) {
        super(tower);
    }
    @Override
    void fly() {
        System.out.println("plane1 申请起飞");
        tower.action(this,"fly");
    }
    @Override
    void flow() {
        System.out.println("plane1 申请降落");
        tower.action(this,"flow");
    }
}

public class Plane2 extends AbstractPlane {
    Plane2(Tower tower) {
        super(tower);
    }

    @Override
    void fly() {
        System.out.println("plane2 申请起飞");
        tower.action(this,"fly");
    }

    @Override
    void flow() {
        System.out.println("plane2 申请降落");
        tower.action(this,"flow");
    }
}

状态模式

  • 类图和策略模式是一样的 但是主打的就是一个状态进行流转
  • 也可以自己控制状态的流转
public abstract class PlayState {
    PlayState nextState;
    public abstract void play();
}

public class PowerState extends PlayState {

    PowerState(PlayState nextState) {
        this.nextState = nextState;
    }
    @Override
    public void play() {
        System.out.println("我充满力量");
        nextState.play();
    }
}

public class VictoryState extends PlayState {

    VictoryState(PlayState nextState) {
        this.nextState = nextState;
    }

    @Override
    public void play() {
        System.out.println("我胜利了");
        nextState.play();
    }
}
public class TiredState extends PlayState {

    TiredState(PlayState nextState) {
        this.nextState = nextState;
    }

    @Override
    public void play() {
        System.out.println("我累了");
    }
}

public class StateMain {
    public static void main(String[] args) {
        PlayState p3 = new TiredState(null);
        PlayState p2 = new VictoryState(p3);
        PlayState p1 = new PowerState(p2);

        p1.play();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值