由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

设计模式—策略模式

JAVA 西门飞冰 748℃
[隐藏]

1.定义

策略模式Strategy是⼀种⾏为设计模式, 它能让你定义⼀系列算法, 并将每种算法分别放⼊独⽴的类中, 以使算法的对象能够相互替换。

2.策略模式的结构

image-20220930092851012

3.案例代码

需求:项目中和数据库打交道,Java中通常会开发一些Dao数据访问对象,来完成与数据库的增删改查操作。但是在Java中这些增删改查操作,不止一种JDBC的方式实现,还有Odbc,Jndi的方式实现,我们为了能让客户在使用和开发的过程中能够方便选择,我们开发了一系列具体的策略实现类,供客户端选择。

策略接口:

public interface UserDao {
    // 定义数据访问对象
    public void insert();
    public void update();
    public void delete();
    public void findById();
}

策略实现类Jdbc:

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方式实现数据查询");
    }
}

策略实现类Odbc:

public class OdbcDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("Odbc方式实现数据插入");
    }

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

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

    @Override
    public void findById() {
        System.out.println("Odbc方式实现数据查询");
    }
}

策略实现类Jndi:

public class JndiDao implements UserDao {
    @Override
    public void insert() {
        System.out.println("JNDI方式实现数据插入");
    }

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

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

    @Override
    public void findById() {
        System.out.println("JNDI方式实现数据查询");
    }
}

Contenxt上下⽂类:⽤于使⽤策略,通过策略接⼝完成代码逻辑内部持有接⼝

public class UserService {
    public UserDao dao = null;

    // 从外侧传入对应的策略
    public UserService(UserDao dao) {
        this.dao = dao;
    }

    // 完成业务逻辑
    public void createUser(){
        System.out.println("正在创建用户对象");
        dao.insert();
    }
}

客户端:在运行时决定到底使用那种策略完成业务逻辑

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;
            default:
                dao = new JdbcDao();
        }
        // 创建的策略直接传入到上下文当中
        UserService userService = new UserService(dao);
        userService.createUser();
    }
}

4.策略模式优点:

你可以在运⾏时切换对象内的算法。

你可以将算法的实现和使⽤算法的代码隔离开来。

你可以使⽤组合来代替继承。

开闭原则。 你⽆需对上下⽂进⾏修改就能够引⼊新的策略。

5.策略模式缺点:

如果你的算法极少发⽣改变, 那么没有任何理由引⼊新的类和接⼝。 使⽤该模式只会让程序过于复杂。

客户端必须知晓策略间的不同——它需要选择合适的策略。

许多现代编程语⾔⽀持函数类型功能, 允许你在⼀组匿名函数中实现不同版本的算法。 这样, 你使⽤这些函数的⽅式就和使⽤策略对象时完全相同, ⽆需借助额外的类和接⼝来保持代码简洁。

6.策略模式应⽤场景

当你想使⽤对象中各种不同的算法变体, 并希望能在运⾏时切换算法时, 可使⽤策略模式。

当你有许多仅在执⾏某些⾏为时略有不同的相似类时, 可使⽤策略模式。

如果算法在上下⽂的逻辑中不是特别重要, 使⽤该模式能将类的业务逻辑与其算法实现细节隔离开来。

 

转载请注明:西门飞冰的博客 » 设计模式—策略模式

喜欢 (0)or分享 (0)