一.前言

今天开始我们专题的第七课了。本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式、策略模式让你代码更优雅,消除程序大量冗余的代码。本章节参考资料书籍《Spring 5核心原理》中的第一篇 Spring 内功心法(Spring中常用的设计模式)(没有电子档,都是我取其精华并结合自己的理解,一个字一个字手敲出来的)。

2|0委派模式

2|1委派模式的定义及应用场景

​ 委派模式不属于GOF23种设计模式中。委派模式(Delegate Pattern)的基本作用就是负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式在Spring中应用非常多,大家常用的DispatcherServlet其实就是用到了委派模式。现实生活中也常有委派的场景发生,例如:老板(Boss)给项目经理(Leader)下达任务,项目经理会根据实际情况给每个员工派发工作任务,待员工把工作任务完成之后,再由项目经理汇报工作进度和结果给老板。我们用代码来模拟下这个业务场景,先来看一下类图:

创建员工接口

package com.study.demo2;/*** @ClassName IEmployee* @Deacription 员工接口* @Author wang.zhong.yuan* @Date 2020/7/9 16:36* @Version 1.0**/
public interface IEmployee {/*** 需要做的工作* @param command*/void doingSomeThing(String command);
}

员工A实现类

package com.study.demo2;/*** @ClassName EmployeeA* @Deacription 员工A* @Author wang.zhong.yuan* @Date 2020/7/9 16:38* @Version 1.0**/
public class EmployeeA implements IEmployee {public void doingSomeThing(String command) {System.out.println("我是员工A,需要做:"+command);}
}

员工B实现类

package com.study.demo2;/*** @ClassName EmployeeB* @Deacription 员工B* @Author wang.zhong.yuan* @Date 2020/7/9 16:48* @Version 1.0**/
public class EmployeeB implements IEmployee {public void doingSomeThing(String command) {System.out.println("我是员工B,我要做:"+command);}
}

领导类

package com.study.demo2;import java.util.HashMap;
import java.util.Map;/*** @ClassName Leader* @Deacription 领导类* @Author wang.zhong.yuan* @Date 2020/7/9 16:51* @Version 1.0**/
public class Leader implements IEmployee {private Map<String,IEmployee> underling = new HashMap<String, IEmployee>();public Leader() {underling.put("注册功能",new EmployeeA());underling.put("登陆功能",new EmployeeB());}/*** 自己不做事,委派给对应的员工去做* @param command*/public void doingSomeThing(String command) {underling.get(command).doingSomeThing(command);}
}

创建BOSS类,安排工作给Leader

package com.study.demo2;/*** @ClassName Boss* @Deacription TODO* @Author 19054253* @Date 2020/7/9 17:03* @Version 1.0**/
public class Boss {public void command(String command, Leader leader){leader.doingSomeThing(command);}//测试功能public static void main(String[] args) {//客户请求(Boss)、委派者(Leader)、被被委派者(Target)//委派者要持有被委派者的引用//代理模式注重的是过程, 委派模式注重的是结果//策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用//委派的核心:就是分发、调度、派遣//委派模式:就是静态代理和策略模式一种特殊的组合Boss boss = new Boss();Leader leader = new Leader();boss.command("登陆功能",leader);}
}

输出结果

通过上面的代码,生动地还原了项目经理分配工作的业务场景,也是委派模式的生动体现。

3|0策略模式

3|1策略模式的定义与应用

策略模式(Strategy Pattern)是指定义了算法家族、分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。假如系统中有很多类,而他们的区别仅仅在于他们的行为不同。一个系统需要动态地在几种算法中选择一种,都可以用策略模式实现。

3|2代码实现

一个常见的应用场景就是大家在下单支付时会提示选择支付方式,如果用户未选,系统也会默认好推荐的支付方式进行结算。来看一下类图,下面我们用策略模式来模拟此业务场景:

创建支付状态类:

package com.study.demo3;/*** @ClassName PayState* @Deacription 支付状态* @Author wang* @Date 2020/7/9 17:48* @Version 1.0**/
public class PayState {private int code;private Object data;private String message;public PayState(int code, Object data, String message) {this.code = code;this.data = data;this.message = message;}@Overridepublic String toString() {return "PayState{" +"code=" + code +", data=" + data +", message='" + message + '\'' +'}';}
}

创建支付接口

package com.study.demo3;/*** @ClassName Payment* @Deacription 支付渠道* @Author wang* @Date 2020/7/9 19:12* @Version 1.0**/
public interface IPayment {/*** 获取支付类型* @return*/String getName();/*** 查询余额* @param uid* @return*/double queryBalance(String uid);/*** 支付* @param uid* @param amount* @return*/PayState pay(String uid,double amount);}

创建支付抽象类,完成一些通用的代码:

package com.study.demo3;/*** @ClassName AbstractPayment* @Deacription 支付抽象类* @Author wang* @Date 2020/7/9 19:16* @Version 1.0**/
public abstract class AbstractPayment implements IPayment{public PayState pay(String uid, double amount) {if (queryBalance(uid) < amount){return new PayState(-1,"支付失败","余额不足");}return new PayState(200,"支付成功","共计支付:"+amount);}
}

创建阿里支付渠道

package com.study.demo3;/*** @ClassName AliPay* @Deacription 支付宝支付* @Author wang* @Date 2020/7/9 19:20* @Version 1.0**/
public class AliPay extends AbstractPayment {public String getName() {return "支付宝支付";}public double queryBalance(String uid) {return 500;}
}

创建京东支付渠道

package com.study.demo3;/*** @ClassName JDPay* @Deacription 京东支付* @Author wang* @Date 2020/7/9 19:22* @Version 1.0**/
public class JDPay extends AbstractPayment {public String getName() {return "京东支付";}public double queryBalance(String uid) {return 900;}
}

创建微信支付渠道

package com.study.demo3;/*** @ClassName WXPay* @Deacription 微信支付* @Author wang* @Date 2020/7/9 19:23* @Version 1.0**/
public class WXPay extends AbstractPayment {public String getName() {return "微信支付";}public double queryBalance(String uid) {return 256;}
}

输出结果:

希望通过大家耳熟能详的业务场景来举例,让小伙伴们更深刻地理解策略模式。

4|0小结

4|1策略模式的优缺点

优点:
1、策略模式符合开闭原则。
2、避免使用多重条件转移语句,如if...else...语句、switch语句
3、使用策略模式可以提高算法的保密性和安全性。

缺点:
1、客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
2、代码中会产生非常多策略类,增加维护难度。

往期专题:

大型Java进阶专题(一) 软件架构设计原则(上)

大型Java进阶专题(三) 软件架构设计原则(下)

大型Java进阶专题(四) 设计模式之工厂模式

大型Java进阶专题(五) 设计模式之单例模式

Java进阶专题(六) 设计模式之代理模式

Java进阶专题(七) 设计模式之委派模式与策略模式相关推荐

  1. Java进阶专题(八) 设计模式之适配器模式、装饰者模式、观察者模式

    本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式.本章节参考资料书籍<Spring ...

  2. 打印鸭子戏水java,《Head first设计模式》学习笔记 #8211; 策略模式,

    <Head first设计模式>学习笔记 – 策略模式, 策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 假设有一个模拟鸭子的游戏,游 ...

  3. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  4. java状态模式和策略模式_Java状态和策略设计模式之间的差异

    java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...

  5. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  6. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  7. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

  8. 委派模式与策略模式综合应用

    在上面的代码中我们列举了非常几个业务场景,相信小伙伴对委派模式和策略模式有了非常深刻的理解了.现在,我们再来回顾一下,DispatcherServlet 的委派逻辑,代码如下: private voi ...

  9. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

最新文章

  1. 亲身经历,在实验室不要乱按按钮!!
  2. Django学习笔记之Django QuerySet的方法
  3. Java连接Memcached进行CRUD
  4. Eureka Client注册到Eureka Server的秘密
  5. 【UVA12304】2D Geometry 110 in 1!(外接圆/内切圆/切点等圆相关问题的模版题)
  6. 【UVA-10891】Game of Sum【区间DP】
  7. 实验1 建立数据库
  8. 雨课堂《工程伦理》期末考试答案
  9. 获取浏览器高度和宽度
  10. 百度云apkg手机文件怎么打开_30秒教你找回vivo手机误删文件,要是你不会的话,那也太可惜了吧...
  11. python实战 爬取网易云评论信息
  12. 笔记本桌面计算机图标不显示不出来,电脑桌面一片空白不显示图标的处理方法...
  13. 解决最新小马激活工具导致主页劫持问题
  14. 怎么下载优酷视频呢,你可以这样下
  15. 【Python爬虫】爬取新浪微博评论看网友如何评价NBA季后赛火箭VS爵士G3
  16. GBase 8s Java UDR安装说明
  17. Error running 'PY201': Cannot run program C:\Users\GJ\AppData\Local\Programs\Python\Python37\python
  18. 写一封信给N年前的自己
  19. Xmind 8 安装及破解方法
  20. 利用mentor建立局域网服务器

热门文章

  1. 【学习笔记】BZOJ4479 吃货jyy
  2. 2 配置交换机接口双工模式和速率
  3. 达梦DM8数据库体系结构
  4. 简单理解阻塞Io和非阻塞io
  5. finally的执行顺序问题
  6. Loki Promtail 详解
  7. 超全:Word常用快捷键
  8. 搞个这样的APP要多久
  9. AVPlayer自定义视频播放器
  10. 小米html查看器打开,Excel文件查看器