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的更多相关文章

  1. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  2. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  3. [转]Design Pattern Interview Questions - Part 3

    State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...

  4. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  5. 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 ...

  6. 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 ...

  7. java设计模式大全 Design pattern samples in Java(最经典最全的资料)

    java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...

  8. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  9. [转]Design Pattern Interview Questions - Part 2

    Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...

随机推荐

  1. 我的Emacs折腾经验谈(四) 也谈Yasnippet

    又是好久没更新了,不过还好,现在慢慢有点感觉了,好长时间不写博客会心里有点感觉欠一点什么东西.觉得每次写了东西都往主页推搞得压力好大,以后就不往网站首页推了,纯留下来供参考,另外就是主要方便从搜索找过 ...

  2. 持续集成环境Gitlab-CI的官方安装过程解析

    持续集成环境是一个非常重要的工具,在分工合作的项目中有着举足轻重的作用.公司最近要用Gitlab,需要配套的持续集成环境.研究了官方的文档,感觉官方的文档不是很明了.各种修改过后终于成功了.为了大家安 ...

  3. 实战 ASP.NET MVC Web API

    实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...

  4. launch failed.Binary not found

    1.在eclipse官网中下载已经集成了CDT的eclipse.(http://www.eclipse.org/downloads/download.php?file=/technology/epp/ ...

  5. 从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结

    一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...

  6. 我是实践派之mongo的一主多从

    mongo一主多从 为什么要做一主多从? mongodb天生就是为了分布式而生的,为了保证数据读写分离和数据安全,把数据放在不同的机子上,可以减少主节点的读压力,而让从节点去承受读请求压力. 主节点用 ...

  7. 二度云抢先成为首批中国工信部(.vip/.xyz/.club)域名注册管理机构

    今天,工信部官网的公示文件显示,新通用顶级域名.vip..xyz以及.club域名注册局已正式获得工信部审批,成为中国境内合法的顶级域名注册管理机构,这标志着.vip..xyz以及.club域名成为首 ...

  8. hdu1046

    #include<iostream> #include<cmath> using namespace std; int main() { int T,t=0,m,n; cin& ...

  9. 巧用ajax请求服务器加载数据列表时提示loading

    我们利用weui.js中的weui.loading为效果,ajax的beforeSend与complete方法,做一个加载数据时会有几秒的 loading... 要在页面需要加载的JS文件: < ...

  10. Cstring 的用法

    CString位于头文件afx.h中. 这篇文章就来讨论这些技巧. 使用CString可以让你对字符串的操作更加直截了当.这篇文章不是CString的完全手册,但囊括了大部分常见基本问题. 这篇文章包 ...