Design Pattern - Strategy
Strategy Pattern:
The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
第一个设计原则
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,把会变化的部分取出并“封装”起来,好让其他部分不受影响。从而使变化引起的不经意后果变少,系统更有弹性,实现对改变关闭对扩展开放的原则。在实际的编码过程中可以随心所遇的使用多态,继承,封装三大特性。
第二个设计原则
针对接口编程而不是针对实现编程。
第三个设计原则
多用组合,少用继承。
策略模式组成:
策略模式的应用场景:
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
具体应用案例
package cn.com.dp.characters; import cn.com.dp.imp.Weapon;
public abstract class Character {
//Character有一个weapon接口对应的行为
private Weapon weapon; public Weapon getWeapon() {
return weapon;
} public void setWeapon(Weapon weapon) {
this.weapon = weapon;
} public abstract void fight();
public abstract String selfInfo();
}
package cn.com.dp.characters; /**
* 角色:郭嘉
*
* @author cpt
*
*/
public class GuoJia extends Character {
@Override
public void fight() {
System.out.print(selfInfo());
super.getWeapon().attack();
} @Override
public String selfInfo() {
return "呵呵,就这样吧....";
}
}
package cn.com.dp.characters; /**
* 角色:贾诩
* @author cpt
*
*/
public class JiaXu extends Character{ @Override
public void fight() {
System.out.print(selfInfo());
getWeapon().attack();
} @Override
public String selfInfo() {
return "我能完杀!!!";
} }
package cn.com.dp.imp;
/**
* 所有武器攻击效果接口
* @author cpt
*
*/
public interface Weapon {
void attack();
}
package cn.com.dp.impl; import cn.com.dp.imp.Weapon;
/**
* 诸葛连弩攻击效果,可复用替换
* @author cpt
*
*/
public class AK47 implements Weapon { @Override
public void attack() {
System.out.println("AK47连续攻击效果");
} }
package cn.com.dp.impl; import cn.com.dp.imp.Weapon;
/**
* 麒麟弓攻击效果,可复用替换
* @author cpt
*
*/
public class UnicornBow implements Weapon { @Override
public void attack() {
System.out.println("麒麟弓命中射马攻击效果");
} }
package cn.com.dp.context; import cn.com.dp.characters.GuoJia;
import cn.com.dp.characters.JiaXu;
import cn.com.dp.impl.AK47;
import cn.com.dp.impl.UnicornBow; public class StrategyTestContext {
public static void main(String[] args) {
AK47 ak47 = new AK47();
UnicornBow unicornBow=new UnicornBow(); GuoJia guoJia = new GuoJia();
guoJia.setWeapon(ak47);
guoJia.fight(); JiaXu jiaXu = new JiaXu();
jiaXu.setWeapon(unicornBow);
jiaXu.fight(); jiaXu.setWeapon(ak47);
jiaXu.fight();
}
}
关于策略模式能不能消除if else判断结构,个人认为策略模式是做不到。
http://programmers.stackexchange.com/questions/146761/design-pattern-for-handling-a-response
http://industriallogic.com/xp/refactoring/conditionalWithStrategy.html
个人对策略模式理解总结:
所有的设计模式并不是为了为了约定编程规范,而是一种总结下来针对特定需求的设计模式而绝不是编程模式,完全没有必要刻意去迁就设计模式,而且设计模式并不是什么高深的技术不过是巧妙地运用Java特性对代码进行解耦。但是了解各个模式的设计技巧核心本质对以后设计项目以及编写模块代码会有很大的帮助。策略模式巧妙的地方在于把应用中一类相似的变化的行为代码封装成可复用独立于执行环境的组件供策略环境角色随意组合调用,如果变化的行为代码不可复用那么就没有必要使用策略模式。
Design Pattern - Strategy的更多相关文章
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- [转]Design Pattern Interview Questions - Part 3
State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
- C++ Design Pattern: What is a Design Pattern?
Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...
- Design Pattern in Simple Examples
Instead of defining what is design pattern lets define what we mean by design and what we mean by pa ...
- java设计模式大全 Design pattern samples in Java(最经典最全的资料)
java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 2
Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...
随机推荐
- spring实现数据库读写分离
现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应 ...
- enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现
enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用 ...
- TOGAF架构内容框架之架构制品(上)
TOGAF架构内容框架之架构制品(上) 4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方 ...
- Centos 5上使用YUM安装GIT
网上搜索的基本上都是一样的内容 1.先安装git依赖的包 yum install zlib-devel yum install openssl-devel yum install perl yum i ...
- JAXP的SAX解析
* 使用Sax解析XML文档 * * 使用Sax解析文档和DOM解析不一样. * 概述: * 是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一 ...
- java基础知识拾遗(三)
1.类加载 bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. extension classloader -扩展类加载器,它负责加载JRE的扩展目 ...
- [ios2] CABasicAnimation【转】
caanimation 整理了解 http://geeklu.com/2012/09/animation-in-ios/ 几个可以用来实现热门APP应用PATH中menu效果的几个方法 +(CABa ...
- 正则表达式之邮箱验证javascript代码
fuchangxi的正则: 复制代码 代码如下: /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g 开始必须是一个或者多个单词 ...
- vim 模式基础操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 虽然Emacs已经可以完成大部分的编辑操作,但有时候为了方便也会用到vim.所以记录了 ...
- select的onchange事件获取不了option的value
一,select的onchange事件获取不了option的value是当你使用JQ($("#xxx").val())方法的获取的值一直提示undefined 二,解决方法: va ...