我们开发过程中,常因为一开始的架构不怎么合理而有可能造成后边客户或者项目经理改需求时,造成我们需要修改原来的代码,一方面是可能写的时间久了回顾起来麻烦,另一方面是牵一发而动全身,改动一个地方造成所有的地方都需要改动,由此可见一个好的架构是多么重要。那么今天给大家讲一种策略设计模式来定义一个利于扩展的框架。

简单举个例子,我们开发一款游戏如果有需要定义一个角色,有武器攻击,有武器防御,那我们可能会觉得很简单,然后一开始定义就直接定义一个父类,再加一个子类实现,代码如下:

abstract class Role {

protected String name;

protected abstract void attack();

protected abstract void defend();

}

子类实现如下:

class RoleA extends Role {

public RoleA(String name) {

this.name = name;

}

protected void attack() {

System.out.println("多兰剑");

}

protected void defend() {

System.out.println("多兰盾");

}

}

那么这个时候项目经理告诉你改需求了,又新创建了一个角色法师他也有攻击也有防御,这个时候你又得重新创建一个类

class RoleB extends Role {

public RoleB(String name) {

this.name = name;

}

protected void attack() {

System.out.println("多兰戒");

}

protected void defend() {

System.out.println("多兰盾");

}

}

这个时候你会发现代码重用的效果根本就没有达到,而且如果我人物角色又添加了其他的攻击方式,或者有多个武器装备的时候,就得改源代码了,那么今天我们先解决这个代码重用且利于扩展的问题,这里就引出我们的策略设计模式了,至于多个攻击方式,我们后边给大家介绍装饰者设计模式再说。那么重新定义该怎么定义呢,首先,我们把这些可变的攻击方式抽取出来,单独形成一个接口:

//攻击的接口

interface Attackable{

void attack();

}

//防御的接口

interface Denfenseable{

void denfense();

}

其次,攻击方式我们单独实现攻击接口,防御方式单独实现防御接口

class 多兰剑 implements Attackable{

public void attack() {

System.out.println("多兰剑攻击犀利");

}

}

class 多兰盾 implements Denfenseable{

public void denfense() {

System.out.println("防御我在行");

}

}

class 多兰戒 implements Attackable{

public void attack() {

System.out.println("多兰戒法强高");

}

}

那么我们在抽象一个共同的父类出来,定义一些每个角色共有的一些属性

abstract class Role{

public String name;

Attackable a;            //将接口的引用封装到Role中,利用多态来更利于变化

Denfenseable d;

public Role(){}

public void setAttackable(Attackable a){

this.a = a;

}

public void setDenfenseable(Denfenseable d){

this.d = d;

}

protected void attack() {

a.attack();

}

protected void defend() {

d.denfense();

}

}

这个时候我们需要角色A,比如剑圣的话,就可以直接创建剑圣来实现Role类

class RoleA extends Role{

public RoleA(String name){

this.name = name;

}

}

真正调用过程中直接

RoleA a = new RoleA ("剑圣");

a.setAttackable(new 多兰剑());

a.setDenfenseable(new 多兰盾());

a.attack();

a.defend();

这样即重用了代码,又降低了耦合。一举多得。

那么总结起来的话:

策略模式:建立行为族,将不同的行为分别封装,同时彼此可相互替代,算法的变化可以独立于使用者。
优点:提高了可复用性,将行为和使用者解耦出来

应用场景:

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(具体实现可任意变化或扩充)

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

如何构建一个优秀的开发框架相关推荐

  1. 如何构建一个优秀的销售团队?

    如何才能建立一支高效.高素质的销售团队?我想这个问题是企业的经理人们最关心的问题之一.销售部门是企业通向市场过程中至关重要的一环,销售人员把产品推向市场,让产品最终体现出价值,又从市场中拿来信息回馈给 ...

  2. 谷歌教你25招构建一个优秀的移动网站

    谷歌公司的研究人员聆听了119个小时用户对移动网站的抱怨,了解到构建移动网站的精髓. 最近,来自谷歌公司和AnswerLab的研究人员主持了一场长达119小时的用户测试会议,他们每天都会让用户访问10 ...

  3. 揭秘华为AI一站式开发平台,3步构建一个AI模型 | 华为昇腾师资培训沙龙西安场...

    2018 年,在第三届 HUAWEI CONNECT(华为全联接大会)上,华为首次公布了 AI 战略与全栈全场景 AI 解决方案,其中包含全球首个覆盖全场景人工智能的华为昇腾(Ascend)系列处理器 ...

  4. 如何从0到1构建一个稳定、高性能的Redis集群?(附16张图解)

    阅读本文大约需要 13 分钟. 大家好,我是 Kaito. 这篇文章我想和你聊一聊 Redis 的架构演化之路. 现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Red ...

  5. 道器相融,由Angel论一个优秀机器学习平台的自我修养

    *本文首发于 AI前线 ,欢迎转载,并请注明出处. 摘要 2017年6月,腾讯正式开源面向机器学习的第三代高性能计算平台 Angel,在GitHub上备受关注:2017年10月19日,腾讯T4专家An ...

  6. 构建maven项目插件_如何构建一个Maven插件

    构建maven项目插件 使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 今天尝试Okta. 由于其插件生态系统的普 ...

  7. 如何构建一个Maven插件

    使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. 今天尝试Okta. 由于其插件生态系统的普及,Apache Mav ...

  8. 如何成为一个优秀的程序员_如何成为一名优秀的程序员

    如何成为一个优秀的程序员 by Amy M Haddad 通过艾米·M·哈达德(Amy M Haddad) 如何成为一名优秀的程序员 (How to be a great programmer) Wh ...

  9. 如何构建一个流量无损的在线应用架构 | 专题尾篇

    简介:我们将这些年在每一个环节中的相应解决方案,以产品化的方式沉淀到企业级分布式应用服务(EDAS)中.EDAS 致力于解决在线应用的全流程流量无损,经过 6 年的精细打磨,已经在流量接入与流量服务两 ...

最新文章

  1. Typedef用法(转载)
  2. 到底什么是故事点(Story Point)?
  3. Win7环境下搭建GO开发平台——SublimeText 2
  4. 电商后台:实例解读订单系统
  5. excel转latex,markdown,html表格的神仙网站!科研必备!
  6. c语言游戏编程网盘下载,C语言游戏编程 计算器(5分下载)
  7. 新建Silverlight文件的方法
  8. 关于 PHP 5.4 你所需要知道的
  9. spark 应用场景2-身高统计
  10. 对字符串进行加密解密
  11. Java垃圾回收机制分析
  12. java毕业设计题目大全
  13. hibernate一对多关系
  14. uoj #172. 【WC2016】论战捆竹竿
  15. 嵌入式系统开发-麦子学院(3)——Linux C初级编程1
  16. 树莓派(4B)入门教程
  17. TSE2019-The Art, Science, and Engineering of Fuzzing: A Survey
  18. Eureka注册服务配置info-使用$project.artifactId$无法动态显示artifactId
  19. matlab 动态图只能显示等平面吗,matlab平面浓度图
  20. 在web网页中打开word文档

热门文章

  1. HDU4417 Super Mario (主席树模板)
  2. 心系天下三星W23 | W23 Flip双旗舰折叠屏震撼发布
  3. XV6-Lab-Filesystem
  4. PBJ | 华中科大宁康组揭示甘草根转录组-微生物群落-次级代谢产物调控模式
  5. -已解决-NVIDIA安装程序失败-win10
  6. 818专业课【考经】—《信号系统》之章节概要:第五章 连续时间信号的变换域分析
  7. Blueprints - UE4第三人称游戏角色控制
  8. 智慧社区平台建设应该从哪几个方面入手?
  9. 2022新伯乐发卡系统源码+无需授权/附多模板
  10. php让手机浏览器记住密码,php 利用cookie实现网页记住用户名和密码的功能