近来不太忙,就打算抽空看下源码补充一下知识,当我看了之后我发现看源码的关键是要弄清楚类之家的关系以及为何要这样的关系,否则如果只看具体的代码那不如去学习会儿算法。

于是就打算从设计模式入手,边学习边记录自己的心得体会, 如果有什么不对的地方。 欢迎各位大神指正。

策略模式

首先为什么叫策略模式,核心在于策略,说白了就是功能的实现代码。 只是这个代码不与其他类相耦合,但又与业务有关。

就拿英雄联盟举例子吧,平常玩的多些。

现在有四个英雄分别为 : 盖伦、皇子、赵信、诺手。 我们知道游戏中英雄有一个通用的都叫平A。那么这个时候就可以建立一个最基本的平A类


 public Class A{public void   ordinary() {
System.out.println("平A");
}
}


然后当我们鼠标右键点击地方英雄时,就调用方法即可。 但是如果增加Q技能呢,我们知道英雄不一样Q技能是不同的。咱们通常的做法是,声明一个Q技能的接口,然后具体的英雄去实现,也即是

 public interface Q{
public void qSkill();
} public Class GaiLun implements Q extends A {
public void qSkill() {
System.out.println("盖伦的Q技能");
}
}

当我们以这种方式实现时,这样带来的麻烦是不断的去实现、继承、重写。并且q技能的接口与各个实现类都在耦合,接口一动那么多实现类都要修改,前期英雄少还能接受,后面那么多英雄这个工作量可不小。所以这时候要做的就是把英雄类与Q技能接口解耦。把Q技能单独抽取出来个接口,就成了上面说的策略。也就是把英雄的Q技能的算法抽取成策略类。并在类A中引入策略接口的引用。

public Interface Q{
public void qSkill();
} public Class GaiLun implements Q{
public void qSkill() {
System.out.println("盖伦的Q");
}
} public Class HuangZi implements Q{
public void qSkill() {
System.out.println("皇子的Q");
}
} public Class ZhaoXin implements Q{
public void qSkill() {
System.out.println("赵信的Q");
}
} public Class NuoShou implements Q{
public void qSkill() {
System.out.println("诺手的Q");
}
}

这里就把策略接口和算法类抽取了出来,下面就是使用了。

public Class A{
private Q q; public void ordinary() {
System.out.println("平A");
} public void setQ(Q q){
this.q = q;
} public void qSkill(){
q.qSkill();
}
}

在平A中添加Q技能接口的引用,并添加set方法和技能方法的调用。下面就是测试一下。

public Class test{
public static void main(String[] args){
GaiLun gl = new GaiLun();
HuangZi hz = new HuangZi();
ZhaoXin zx = new ZhaoXin();
// 不用策略模式的调用
gl.qSkill(); // 释放Q技能
gl.ordinary(); // 释放平A
// 使用策略模式的调用
A a = new A();
a.setQ(new GaiLun());
a.qSkill(); // 盖伦的Q
a.setQ(new ZhaoXin());
a.qSkill(); // 赵信的Q
} }

优点:可以看到当我释放技能时我的英雄类与Q技能类不再存在关系,而是我传进set方法的是什么才是什么。 就算我Q技能接口增加什么别的操作也不用每个英雄类都作出修改。

缺点:就是每个英雄都会有一个类,当英雄多了那么类也就随之过多。

这里的例子感觉不是很恰当,没有把优缺点体现充分。 如有问题请大神指出,

转载请注明出处!

参考: https://www.cnblogs.com/ZhangHaoShuaiGe/p/7826774.html

23中java设计模式(1)-- 策略模式的更多相关文章

  1. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  2. Java设计模式1——策略模式(Strategy Pattern)

    最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...

  3. JAVA设计模式 之 策略模式

    一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...

  4. Java设计模式之策略模式(一)

    今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...

  5. 折腾Java设计模式之策略模式

    博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...

  6. Java 设计模式之 策略模式

    思维导图: 我们先来看 STRATEGY 设计模式的通俗解释: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心, ...

  7. springboot项目中使用设计模式一策略模式

    策略模式: 使用常用,支付,之前做了微信支付,支付宝支付,然后另外一个同事写了一个银联支付,那么如果代码方法一起就会导致代码不是很好操作所以,采用策略模式进行,同事只需要写一个实现类,就可以了, 在协 ...

  8. Java设计模式之-----策略模式

    首先,我们来看下策略模式的概念.一般的解释如下:     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...

  9. java设计模式之——策略模式

    1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...

随机推荐

  1. js运行机制及异步编程(一)

    相信大家在面试的过程中经常遇到查看执行顺序的问题,如setTimeout,promise,async await等等,各种组合,是不是感觉头都要晕掉了,其实这些问题最终还是考察大家对js的运行机制是否 ...

  2. HDU 2036:改革春风吹满地

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  3. 跳转到AppStore 的不同位置办法

    程序跳转到appstore中指定的应用 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                    ...

  4. 异常、Throwable、finally、File类(十九)

    1.异常的概述和分类 * A:异常的概述 * 异常就是Java程序在运行过程中出现的错误.* B:异常的分类 * 通过API查看Throwable * Error * 服务器宕机,数据库崩溃等 * E ...

  5. liunx命令之【查看某个端口号的使用情况】

    第一:查看端口占用情况的命令:lsof -i:<端口号>

  6. 「咕咕网校 - 基础省选」树上问题的进阶 by Drench

    一定要在noip之前把自己花钱买的Luogu网课梳理完!QAQ 树上前缀和: 对于有根树,在每个点记录 val (点权) 和 sum(到根的点权之和) 当然记录的值因题而异(但是既然叫树上前缀和当然就 ...

  7. AutoIt获取Gridview中可以修改列的值

    有一个界面如上图:黑色框框部分是一个整体,也是一个gridview,如果我想把框框中右侧数据获取出来,该如何操作? 我尝试过了很多途径,都无法成功. 今天,我发现,当鼠标焦点在黑色框框左侧的部分的时候 ...

  8. robotframework:appium切换webview后,在webview里滑动屏幕

    问题: 在用robot写手机淘宝app的自动化时,打开手机淘宝后,点击天猫国际,跳转到天猫国际页面,天猫国际页面是H5, 需要切换到对应的webview,切换到webview后,点击美妆菜单,跳转到美 ...

  9. ASP.NET Core:template

    ylbtech-ASP.NET Core: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://yl ...

  10. HTTP错误code大全

    100 - Continue 101 - Switching Protocols Top Success Codes 200 - OK 201 - Created 202 - Accepted 203 ...