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

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

策略模式

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

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

现在有四个英雄分别为 : 盖伦、皇子、赵信、诺手。 我们知道游戏中英雄有一个通用的都叫平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. MySQL 权限生效

    用GRANT.REVOKE或SET PASSWORD对授权表施行的修改会立即被服务器注意到. 如果你手工地修改授权表(使用INSERT.UPDATE等等),你应该执行一个FLUSH PRIVILEGE ...

  2. 一步一步学Silverlight 2系列(7):全屏模式支持

    一步一步学Silverlight 2系列(7):全屏模式支持   概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言V ...

  3. jsp项目上传到服务器

    我们通过Myeclipse完成一个Java web项目时只能通过本地访问来查看,但是我们想把它上传到服务器上使用外网访问应该怎么做呢,首先肯定是要有一台服务器 个人调试项目试手的话我建议去买阿里云的云 ...

  4. web自动化测试的自身特点

    1.web页面是出现的元素可能具有不确定性 2.不同操作系统上不同web浏览器之间的兼容性 3.web应用的高并发性和容错性 4.移动设备上web客户端兼容性,旋转下和各种触摸特性

  5. 【AMPPZ 2014】 The Captain

    [题目链接] 点击打开链接 [算法] 按x轴排序,将相邻点连边 按y轴排序,将相邻点连边 然后对这个图跑最短路就可以了,笔者用的是dijkstra算法 [代码] #include<bits/st ...

  6. 从1到N的整数中1出现的次数

    /* * 1-n整数中1出现的次数.cpp * * Created on: 2018年5月1日 * Author: soyo */ #include<iostream> using nam ...

  7. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  8. servlet 3 文件上传

    1.up.jsp <%@ page language="java" pageEncoding="utf-8"%> <form action=& ...

  9. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时14&&15

    课时14 卷积神经网络详解(上) CNN处理的是一些数据块,在这之间有很多层,一系列的层将输入数据变换为输出数据,所以完成操作的中间量不仅是NN时候讲的那些向量,而是立体结构,有宽,高和深度,在整个计 ...

  10. h.264的POC计算(转载)

    转自:http://www.cnblogs.com/TaigaCon/p/3551001.html 本文参考自http://wenku.baidu.com/link?url=ZPF0iSKzwLQg_ ...