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++中可以用虚类),然后在类中包含这 ...
随机推荐
- 使用std::mutex取代QMutex
为了保证对某个资源的操作是原子性的(对资源读写时,只有当前的操作结束,才允许另外线程对其操作,这里有个理解误区,资源操作原子性不是说,当前某个线程获得了某个资源使用权,然后线程执行时间完毕,要切换线程 ...
- PHP获取类名及所有函数名
PHP获取当前类名.方法名 __CLASS__ 获取当前类名 __FUNCTION__ 当前函数名(confirm) __METHOD__ 当前方法名 (bankcard::confirm) _ ...
- 序列化FastReport,重要提示少走弯路 good
原本在开发一个报表插件,因为需要远程传输,因此需要序列化报表,序列化FastReport有两种方式, 1.仅序列化数据,由客户端接受到数据,并呈现报表,这种方式需要在客户端存储报表格式文件xxx.Fr ...
- 分享一个好用的函数吧,将js中的对象转成url参数
JavaScript&jQuery获取url参数方法 这个函数呢是自己在写基于Vue+ElementUI管理后台时用到的,,下面列出来两种使用方式: 最普通的,封装一个js函数 /** * 对 ...
- adb 连接时候不弹出授权对话框【转】
本文转载自:http://blog.csdn.net/sinc00/article/details/44957943 在首次使用adb connect,然后adb shell的时候,常常需要点击弹出的 ...
- 使用JQuery.Validate插件来校验页面表单有效性
使用JQuery.Validate插件来校验页面表单有效性1. [代码] 常见的注册表单元素 <form action="#" method="post" ...
- ORACLE 创建表空间及用户
/*创建存放原始数据的表空间*/ create tablespace Djzh_original datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\Djzh_or ...
- [Selenium] HTML5 中的 Geolocation
在 HTML5 ,新特性 Geolocation 用于定位用户位置信息. 由于用户位置信息是敏感信息,所以需要得到用户允许后,才能让程序通过 API 获取当前用户信息.WebDriver 程序每次重 ...
- 【转】cocos2dx 内存管理机制
原文地址: http://www.zaojiahua.com/memory-management.html cocos2dx采用的是在堆上分配内存空间,想想看你在写程序的时候对于cocos2dx中的类 ...
- 【旧文章搬运】Idle进程相关的一些东西
原文发表于百度空间,2009-05-13========================================================================== Idle进 ...