23中java设计模式(1)-- 策略模式
近来不太忙,就打算抽空看下源码补充一下知识,当我看了之后我发现看源码的关键是要弄清楚类之家的关系以及为何要这样的关系,否则如果只看具体的代码那不如去学习会儿算法。
于是就打算从设计模式入手,边学习边记录自己的心得体会, 如果有什么不对的地方。 欢迎各位大神指正。
策略模式
首先为什么叫策略模式,核心在于策略,说白了就是功能的实现代码。 只是这个代码不与其他类相耦合,但又与业务有关。
就拿英雄联盟举例子吧,平常玩的多些。
现在有四个英雄分别为 : 盖伦、皇子、赵信、诺手。 我们知道游戏中英雄有一个通用的都叫平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)-- 策略模式的更多相关文章
- JAVA 设计模式之策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...
- Java设计模式1——策略模式(Strategy Pattern)
最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...
- JAVA设计模式 之 策略模式
一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...
- Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...
- 折腾Java设计模式之策略模式
博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...
- Java 设计模式之 策略模式
思维导图: 我们先来看 STRATEGY 设计模式的通俗解释: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心, ...
- springboot项目中使用设计模式一策略模式
策略模式: 使用常用,支付,之前做了微信支付,支付宝支付,然后另外一个同事写了一个银联支付,那么如果代码方法一起就会导致代码不是很好操作所以,采用策略模式进行,同事只需要写一个实现类,就可以了, 在协 ...
- Java设计模式之-----策略模式
首先,我们来看下策略模式的概念.一般的解释如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...
- java设计模式之——策略模式
1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...
随机推荐
- linux网络配置及IP绑定
在学习时,参考了这篇文章:http://blog.csdn.net/collection4u/article/details/14127671:在这篇文章中作者讲述了VMware中虚机的三种网络模式: ...
- POJ 3750 小孩报数问题 (线性表思想 约瑟夫问题 数组模拟运算的 没用循环链表,控制好下标的指向就很容易了)
小孩报数问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10423 Accepted: 4824 Descripti ...
- Oracle常用数据库表操作
配置数据库: user:orcl.passward:71911.Hao全局数据库名:orcl..解锁数据库用户名,SCOTT,SYSTEM,SYS, PWD:71911.Hao输入sqlplus, ...
- 【扬中集训 DAY4T3】holiday
[题目链接] 点击打开链接 [算法] 建C棵线段树即可,注意要用前缀和优化 [代码] 这是标程 #include <bits/stdc++.h> using namespace std; ...
- Vue之组件的内容分发
aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUF ...
- const 和指针
c++用了那么久,觉得 const 和指针配合到一起的时候就会有点点分不出来. 如下: const Data* pData; Data const * pData Data * const pData ...
- JavaScript-Tool:jqgrid
ylbtech-JavaScript-Tool:jqgrid jqGrid 是一个用来显示网格数据的jQuery插件,文档比较全面,附带中文版本. 1.返回顶部 2.返回顶部 3.返回顶部 ...
- 死记硬背之Bunside
就是 本质不同的个数为 $$\frac{1}{|G|} \cdot \sum_{|s| \in |G|}{ C(|s|) }$$ 所以,虽然不知道为啥,但是等价类的个数为 $$\sum_{i=1}^{ ...
- “玲珑杯”线上赛 Round #17 河南专场 B:震惊,99%+的中国人都会算错的问题(容斥计算)
传送门 题意 略 分析 是一道稍微变形的容斥题目,容斥一般的公式 \[ans=\sum_iAi-\sum_{i<j}{Ai∩Aj}+\sum_{i<j<k}{Ai∩Aj∩Ak}+.. ...
- oauth2(spring security)报错method_not_allowed(Request method 'GET' not supported)解决方法
报错信息 <MethodNotAllowed> <error>method_not_allowed</error> <error_description> ...