设计模式之策略模式

策略模式的概念

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

个人对策略模式的一些理解

在策略类中对策略接口实现类的方法再封装,根据不同的需求使用不同的策略

举个栗子

小久的书架上有三本书,英语书,数学书,语文书,小久想读书有三种策略:读英语书,读数学书,读语文书,想读那本书就使用哪种策略

使用代码实现

1)准备书本接口类

java 复制代码
package org.xiji.strategyTwo.book;

public interface Book {
    String getBook();
}

2)书本接口实现类

1.语文书

java 复制代码
package org.xiji.strategyTwo.book.Impl;

import org.xiji.strategyTwo.book.Book;

/**
 * 语文书
 */
public class ChineseBook implements Book {
    @Override
    public String getBook() {
        return "语文书";
    }
}

2.英语书

java 复制代码
package org.xiji.strategyTwo.book.Impl;

import org.xiji.strategyTwo.book.Book;

/**
 * 英语书
 */
public class EnglishBook implements Book {

    @Override
    public String getBook() {
        return "英语书";
    }
}

3.数学书

java 复制代码
package org.xiji.strategyTwo.book.Impl;

import org.xiji.strategyTwo.book.Book;

/**
 * 数学书
 */
public class MathBook implements Book {
    @Override
    public String getBook() {
        return "数学书";
    }
}

3)读书策略

java 复制代码
package org.xiji.strategyTwo.book;

/**
 * 读书策略
 */
public class BookStrategy {

    private Book book;

    public BookStrategy(Book book)
    {
        this.book = book;
    }

    /**
     * 获取书本
     *
     */
    public String getBookStrategy()
    {
        return book.getBook();
    }

    public BookStrategy() {
    }
}

4)创建用户类

java 复制代码
package org.xiji.strategyTwo.book;

/**
 * 用户
 */
public class User {

    private String name;

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(String name) {
        this.name = name;
    }

    public void readBook(String book)
    {
        System.out.println(name + "正在读" + book);
    }
}

5) StrategyTwoMain

java 复制代码
package org.xiji.strategyTwo;

import org.xiji.strategyTwo.book.BookStrategy;
import org.xiji.strategyTwo.book.Impl.ChineseBook;
import org.xiji.strategyTwo.book.Impl.EnglishBook;
import org.xiji.strategyTwo.book.Impl.MathBook;
import org.xiji.strategyTwo.book.User;

/**
 * 策略模式
 */
public class StrategyTwoMain {
    public static void main(String[] args) {
        User user = new User("小久");

        //如何小久想读英语书,通过策略模式获取英语书
        System.out.println("小久想读英语书");
        String englishBook = new BookStrategy(new EnglishBook()).getBookStrategy();
        user.readBook(englishBook);
        System.out.println("小久想读数学书");
        //如果小久想读数学书,通过策略模式获取数学书
        String mathBook = new BookStrategy(new MathBook()).getBookStrategy();
        user.readBook(mathBook);
        //如果小久想读语文书,可以通过策略模式获取语文书
        System.out.println("小久想读语文书");
        String chineseBook = new BookStrategy(new ChineseBook()).getBookStrategy();
        user.readBook(chineseBook);


    }
}

6)运行结果

如何添加新的读书策略?

创建新的书本类,实现book接口,并且在读书策略类中获取,调用方法

添加历史书籍

1)创建历史书本类

java 复制代码
package org.xiji.strategyTwo.book.Impl;

import org.xiji.strategyTwo.book.Book;

public class HistoryBook implements Book {

    @Override
    public String getBook() {
        return "历史书";
    }
}

2)修改StrategyTwoMain类

java 复制代码
package org.xiji.strategyTwo;

import org.xiji.strategyTwo.book.BookStrategy;
import org.xiji.strategyTwo.book.Impl.ChineseBook;
import org.xiji.strategyTwo.book.Impl.EnglishBook;
import org.xiji.strategyTwo.book.Impl.HistoryBook;
import org.xiji.strategyTwo.book.Impl.MathBook;
import org.xiji.strategyTwo.book.User;

/**
 * 策略模式
 */
public class StrategyTwoMain {
    public static void main(String[] args) {
        User user = new User("小久");

        //如何小久想读英语书,通过策略模式获取英语书
        System.out.println("小久想读英语书");
        String englishBook = new BookStrategy(new EnglishBook()).getBookStrategy();
        user.readBook(englishBook);
        System.out.println("小久想读数学书");
        //如果小久想读数学书,通过策略模式获取数学书
        String mathBook = new BookStrategy(new MathBook()).getBookStrategy();
        user.readBook(mathBook);
        //如果小久想读语文书,可以通过策略模式获取语文书
        System.out.println("小久想读语文书");
        String chineseBook = new BookStrategy(new ChineseBook()).getBookStrategy();
        user.readBook(chineseBook);
        
        //获取小久想读历史书了
        System.out.println("小久想读历史书");
        String historyBook = new BookStrategy(new HistoryBook()).getBookStrategy();
        user.readBook(historyBook);
        


    }
}

3)运行结果

相关推荐
Wang's Blog9 分钟前
Java框架快速入门: Spring Security+OAuth2之多因子认证与TOTP实战
java·spring·ui
滕州市燕猫虎计算机科技工作室个体工商户27 分钟前
Java面试题汇总
java·开发语言
2301_32241428042 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
YHL2 小时前
🎯 JavaScript 单例模式(Singleton Pattern)—— 从理论到实战
javascript·设计模式
君顾12 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
vx_Biye_Design2 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
名字还没想好☜2 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog3 小时前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云
Doubbbbbbble云3 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
小溪学编程3 小时前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言