【设计模式】策略模式(定义 | 特点 | Demo入门讲解)

文章目录

定义

策略模式Strategy是一种行为模式,它能定义一系列算法,并将每种算法分别放入到独立的类中,以使算法的对象能够相互替换。

比如,你去机场,可以有三种策略:

  • 自行车
  • 公共汽车
  • 出租车

这三种交通方案,自行车不要钱,能欣赏风景;公共汽车便宜速度快;出租车方便速度快,节省时间。这三种方案代表了三种策略,算法。

将上面三种出行方案封装,我们可以灵活选用!

策略模式的结构

通过上图我们知道,策略模式分为四个结构:

  • 策略接口【核心】
  • 策略实现类
  • 上下文Context
    • 具体要实现的业务代码,业务逻辑。
  • 客户端Client
    • 决定使用哪种策略。

QuickStart | Demo

接下来用一个非常容易理解的案例让大家掌握策略模式。

项目结构如下:

├─.idea

├─src

│ ├─main

│ │ ├─java

│ │ │ └─com

│ │ │ └─linghu

│ │ │ └─designer

│ │ │ ├─dao

│ │ │ │ └─impl

│ │ │ └─service

│ │ └─resources

│ └─test

│ └─java

└─target

├─classes

│ └─com

│ └─linghu

│ └─designer

│ ├─dao

│ │ └─impl

│ └─service

└─generated-sources

└─annotations

Step1 | 策略接口

首先定义一个策略接口,这里面封装了数据访问层Dao层的策略方法。

java 复制代码
/**
 * @author linghu
 * @date 2024/7/3 10:27
 */
/*策略接⼝*/
public interface UserDao {
    public void insert();
    public void update();
    public void delete();
    public void findById();
}v

Step2 | 策略实现

面向客户,用户,开发者的时候,我们可以选择不同的数据访问方式,我们可以选择:

  • JDBC
  • JNDI
  • ODBC

具体怎么选,我们需要再客户端让用户自己选。那么在这里我们需要定义好这三种策略实现类。

java 复制代码
/**
 * @author linghu
 * @date 2024/7/3 10:28
 */
public class JdbcDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("JDBC⽅式实现数据插⼊");
    }

    @Override
    public void update() {
        System.out.println("JDBC⽅式实现数据更新");
    }

    @Override
    public void delete() {
        System.out.println("JDBC⽅式实现数据删除");
    }

    @Override
    public void findById() {
        System.out.println("JDBC⽅式实现数据查找");
    }
}
package com.linghu.designer.dao.impl;

import com.linghu.designer.dao.UserDao;

/**
 * @author linghu
 * @date 2024/7/3 10:28
 */
public class JndiDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("JndiDao⽅式实现数据插⼊");
    }

    @Override
    public void update() {
        System.out.println("JndiDao⽅式实现数据更新");
    }

    @Override
    public void delete() {
        System.out.println("JndiDao⽅式实现数据删除");
    }

    @Override
    public void findById() {
        System.out.println("JndiDao⽅式实现数据查找");
    }
}
package com.linghu.designer.dao.impl;

import com.linghu.designer.dao.UserDao;

/**
 * @author linghu
 * @date 2024/7/3 10:28
 */
public class JndiDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("JndiDao⽅式实现数据插⼊");
    }

    @Override
    public void update() {
        System.out.println("JndiDao⽅式实现数据更新");
    }

    @Override
    public void delete() {
        System.out.println("JndiDao⽅式实现数据删除");
    }

    @Override
    public void findById() {
        System.out.println("JndiDao⽅式实现数据查找");
    }
}
package com.linghu.designer.dao.impl;

import com.linghu.designer.dao.UserDao;

/**
 * @author linghu
 * @date 2024/7/3 10:28
 */
public class OdbcDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("OdbcDao⽅式实现数据插⼊");
    }

    @Override
    public void update() {
        System.out.println("OdbcDao⽅式实现数据更新");
    }

    @Override
    public void delete() {
        System.out.println("OdbcDao⽅式实现数据删除");
    }

    @Override
    public void findById() {
        System.out.println("OdbcDao⽅式实现数据查找");
    }
}

Step3 | 上下文服务类

上下文服务,持有某个策略对象dao,但是策略通过外部传入,服务类本身主要完成业务逻辑 insert()

java 复制代码
/**
 * @author linghu
 * @date 2024/7/3 10:33
 */
/*Context*/
public class UserService {
    public UserDao dao = null;
    public UserService(UserDao dao) {
        this.dao = dao;
    }
    public void createUser(){
        System.out.println("正在创建⽤户对象");
        dao.insert();
    }
}

在这里,我们的策略是通过外部传入的:

java 复制代码
    public UserService(UserDao dao) {
        this.dao = dao;
    }

外部策略 通过 UserDao dao传入。

Step4 | 客户端

客户端代码如下:

java 复制代码
/**
 * @author linghu
 * @date ${DATE} ${TIME}
 */
public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        UserDao dao = null;
        switch (input) {
            case "jdbc":
                dao = new JdbcDao();
                break;
            case "odbc":
                dao = new OdbcDao();
                break;
            case "jndi":
                dao = new JndiDao();
                break;
        }
        //策略的创建者在用户端!
        UserService userService = new UserService(dao);
        userService.createUser();
    }
}

根据文本的不同创建不同的策略:

java 复制代码
switch (input) {
            case "jdbc":
                dao = new JdbcDao();
                break;
            case "odbc":
                dao = new OdbcDao();
                break;
            case "jndi":
                dao = new JndiDao();
                break;
        }

策略模式的特点

优点

缺点

相关推荐
geovindu7 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force12 小时前
02_state
设计模式·蓝牙
jimy113 小时前
一个夜间期权交易策略的评价
策略模式·程序员创富
qcx2315 小时前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar1 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu1 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER2 天前
贫血模型的改进
java·开发语言·设计模式·架构
qcx232 天前
Warp源码深度解析(二):自研GPU UI框架——WarpUI的ECH模式与渲染管线
人工智能·ui·设计模式·rust
qcx232 天前
Warp源码深度解析(三):Block-Based终端引擎——Grid模型、PTY与Shell Integration
人工智能·设计模式·架构·wrap
mounter6252 天前
Linux Kernel Design Patterns (Part 2):从经典链表到现代 XArray,拆解内核复杂数据结构的设计哲学
linux·数据结构·链表·设计模式·内存管理·kernel