# dlxz-design-patterns **Repository Path**: ntpu/dlxz-design-patterns ## Basic Information - **Project Name**: dlxz-design-patterns - **Description**: 设计模式学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-28 - **Last Updated**: 2023-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 设计模式, 练习 ## README # 简介 该项目为设计模式的学习! # 策略设计模式 概念未知,直接上代码吧。 只记得说什么策略模式是无状态的。 场景描述: 假设,你有一个计算器,这个计算器可以进行加、减、乘和除运算,你怎么设计让代码具有高扩展性和高维护性。简单的代码随便写写可以,当代码量增加到一定程度的时候,就需要考虑代码的可用性。 传统代码的写法1: ```java String type = "add"; if (type.equals("add")) { System.out.println("add"); } else if (type.equals("sub")) { System.out.println("sub"); } else if (type.equals("mul")) { System.out.println("mul"); } else if (type.equals("div")) { System.out.println("div"); } else { System.out.println("no"); } ``` 例如,这种写法,使用 if else if else 语句。当然,也可以使用 switch case 语句,如: ```java char t = 'a'; switch (t) { case 'a': System.out.println("add"); break; case 'b': System.out.println("sub"); break; case 'c': System.out.println("mul"); break; case 'd': System.out.println("div"); break; default: System.out.println("no type matching"); } ``` 上面两种写法虽然已经实现了给定的场景中的功能,但是确实对后期不够好,例如,这时计算器又增加了取模运算、又增加 了指数运算等等。一下子增加了几百几千个大大小小的功能,请问阁下如何应对?所以在实现基本的功能之上,能将代码变得极具拓展性、可维护性等等特性,才是好代码。 // TODO 详解这段内容 言归正传,那该怎么解决这些问题呢?回到原点,策略模式是针对于无状态的;就是说有没有状态都不会改变程序最终执行的结果。有点抽象,这段等学完状态模式之后再来补充。那使用策略模式该如何解决上述的问题呢? 先来看一下策略模式的类图: ![v28adf7c70a35374a7838f0bb7db71cc9a_r.png](assets/v2-8adf7c70a35374a7838f0bb7db71cc9a_r.png) 看一下,当前项目中的类图示例: ![image.png](assets/image.png) 上代码: ```java package cc.yzqn.strategy; /** * @Author DLXZ * @Date 2023-05-28 12:18:41 */ public class StrategyApp { static class Calc{ private CalcStrategy calcStrategy; public Calc() { } public Calc(CalcStrategy calcStrategy) { this.calcStrategy = calcStrategy; } public void calc(){ calcStrategy.calc(); } } interface CalcStrategy{ void calc(); } static class AddStrategy implements CalcStrategy{ @Override public void calc() { System.out.println("AddStrategy..."); } } static class SubStrategy implements CalcStrategy{ @Override public void calc() { System.out.println("SubStrategy..."); } } static class MulStrategy implements CalcStrategy{ @Override public void calc() { System.out.println("MulStrategy..."); } } static class DivStrategy implements CalcStrategy{ @Override public void calc() { System.out.println("DivStrategy..."); } } public static void main(String[] args) { // 使用各种策略,只需要设置计算策略的实现类,即可。 // 下面通过构造函数来进行演示 // 当然也可以使用其他的方法来进行设置不同策略 new Calc(new AddStrategy()).calc(); new Calc(new SubStrategy()).calc(); new Calc(new MulStrategy()).calc(); new Calc(new DivStrategy()).calc(); } } ``` 其中 calc 类可以算作是统一调用的类也就是所谓的环境类,至于为什么会有这个环境类,为什么不直接创建策略类呢?我个人感觉应该有方便管理、便于组织。还有就是当一个策略需要多个策略来进行辅助时,可以直接在环境类中进行有序的组织。