一、模式解析

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

  策略模式的关键点为:

  1、多种算法存在

  2、算法继承同样的接口,执行同样的行为,为可以替代的

  3、算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算。

二、模式代码

算法接口:

/**
* 算法统一接口,所有算法继承此接口
* @author zjl
* @time 2016-1-24
*
*/
public interface IStrategy {
public void opration();
}

算法具体实现1:

public class StrategyA implements IStrategy {
@Override
public void opration() {
System.out.println("策略A正在执行");
}
}

算法具体实现2:

public class StrategyB implements IStrategy {
@Override
public void opration() {
System.out.println("策略B正在执行");
}
}

算法持有者和调用者

/**
* 算法持有者,通过创建此对象创建算法,并执行算法运算
* @author zjl
*
*/
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy){
this.strategy=strategy;
}
public void execute(){
this.strategy.opration();
}
}

客户端调用程序:

public class Client {
public static void main(String[] args) {
Context context=new Context(new StrategyA());
context.execute();//策略A正在执行
}
}

三、应用场景

策略模式主要侧重于计算,在工作中涉及到银行软件中,最为明显的就是手续费计算,根据不同客户的要求,有些客户要求所有手续费由渠道系统进行计算,有些要求由核心统一计算后提供给渠道,所以就会存在不同客户使用时候进行替换。

四、应用代码

/**
* 手续费查询接口
* @author zjl
*/
public interface IFee {
public int getFee();
}
public class FeeFromLocal implements IFee {
@Override
public int getFee() {
System.out.println("通过本地计算手续费");
return 100;
}
}
/**
* 从核心获取手续费
* @author zjl
*
*/
public class FeeFromRemote implements IFee {
@Override
public int getFee() {
System.out.println("正在从核心获取手续费");
return 100;
}
}

转账交易时候要求计算手续费,此处转账流程略:

public class Transfer {
private IFee feeImpl;
public void setIFee(IFee feeImpl){
this.feeImpl=feeImpl;
}
public void execute(){
System.out.println("转账开始。。。。");
int fee=feeImpl.getFee();
System.out.println("手续费为:"+fee);
System.out.println("转账完成。。。。");
}
}

客户端调用方法,可以是网银或者手机发起

public class Client {
public static void main(String[] args) {
Transfer transfer=new Transfer();
transfer.setIFee(new FeeFromRemote());//项目中手续费计算方式通常由框架进行注入
transfer.execute();
}
}

五、与其他模式关系

1、如果此持有者和策略继承同一个接口,那么策略模式将变为代理模式
   但策略模式和代理模式含义不同,应用场景也不同,代理模式的代理者与被代理这拥有同样的性质和方法
2、通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式
3、策略模式侧重于封装算法

  

[工作中的设计模式]策略模式stategy的更多相关文章

  1. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...

  2. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  3. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  4. [工作中的设计模式]中介模式模式Mediator

    一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...

  5. [工作中的设计模式]桥接模式bridge

    一.模式解析: 策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式. 桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统 ...

  6. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  7. [工作中的设计模式]建造者模式builder

    一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...

  8. [工作中的设计模式]组合模式compnent

    一.模式解析 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 组合模式的要点是: 1.对象整体以树形层次结构进行展示 2.树的根节点和子节点均可以添加删 ...

  9. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. Javascript题库

    一.填空题 JavaScript有两种引用数据类型 :__数组___.__对象__. Javascript通过__setTimeout___延迟指定时间后,去执行某程序. Javascript里Str ...

  2. Crystal Report 遇到需要登录的问题

    解决方式: The advices for crystal report database connection settings: 1, Using ApplyLogOnInfo method in ...

  3. August 9th 2016, Week 33rd Tuesday

    Tomorrow is never clear, our time is here. 明天是未知的,我们还是要过好当下. Tomorrow is not unpredictable, it is cl ...

  4. android中一个解决办法

    E  Trace(732): error opening trace file: No such file or directory (2)android api 的版本和模拟器的版本不一致导致的

  5. set -x 跟踪脚本执行信息

    注意set -x其中"-"与"x"之间没有空格 [root@GitLab sh]# ./sx.sh heelo + a=heelo + echo heelo h ...

  6. elk安装(这个是初级的可以把这个套件安上)

    http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html ELK其实并不是一款软件,而是一整套解决方案,是三个开源软件Elastics ...

  7. .net学习笔记---lambda表达式(自执行方法)

    http://www.cnblogs.com/jesse2013/p/happylambda.html#b034 lambda表达式 http://www.cnblogs.com/OceanEyes/ ...

  8. SQLAlchemy ORM高级查询之过滤,排序

    order_by,filter的语法. 用久了才会熟悉. Session = sessionmaker(bind=engine) session = Session() print(session.q ...

  9. Creating a Table View Programmatically

    https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/Cre ...

  10. android 入门-控件 测量状态栏高度

    private ViewTreeObserver viewTreeObserver; /** 获取可見区域高度 **/ WindowManager manager = getWindowManager ...