策略模式
来源:互联网 发布:手机麻将源码带房卡 编辑:程序博客网 时间:2024/06/15 13:04
策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
Context:
public class CashContext {private Strategy cs;public CashContext(Strategy cssuper){this.cs = cssuper;}public double getResult(double money){return cs.algorInterface(money);}}
Strategy:
public abstract class Strategy { double money;public Strategy(double m){this.money = m;}public double getMoney(){return this.money;}public void setMoney(double m){this.money = m;}public abstract double algorInterface(double m);}ConcreteStrategy:
//正常收费public class CashNormal extends Strategy {public CashNormal(double m){super(m);}public double algorInterface(double m){return m;}}//打折public class CashRebate extends Strategy {private double rebate = 0;public CashRebate(double m,double r){super(m);rebate = r;}public double algorInterface(double m){return m*rebate;}}//满X返Ypublic class CashReturn extends Strategy {private double _return = 0; //满五百反一百, 100private double _condition = 0; //500public CashReturn(double m,double c,double r){super(m);_return = r;_condition = c;}public double algorInterface(double m){double result = m;if(m > _condition){result = m - ((int)(m / _condition))*_return;}return result;}}
客户端
import java.util.ArrayList;import java.util.List;public class CashClient {public static void main(String[] args) {List<String> str = new ArrayList<String>(); str.add("正常收费"); str.add("打8折"); str.add("满300减100");CashContext cashContext = null;for(String ss : str){switch(ss){case "正常收费" :cashContext = new CashContext(new CashNormal(500)); break;case "打8折" :cashContext = new CashContext(new CashRebate(500, 0.8));break;case "满300减100" :cashContext = new CashContext(new CashReturn(500, 300,100));break;default :System.out.println("打烊了.");}double re = cashContext.getResult(500);System.out.println(re);} }}
结果:
500.0400.0400.0
总结:
策略模式主要体现为封装变化点,这种设计思想很重要,看到题目是超市收费,给出的几种收费方式的时候,要想到如何涵盖这些收费方式也就是算法,如何利于后续的扩展,同时如何降低模块之间的耦合度。
策略模式和简单工程模式比较:
简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用。即客户端使用的是工厂类生产的产品对象。
策略模式:客户端创建一个Context类对象a(可以看作是工厂模式中工厂类),创建一个策略对象并传参给对象a,然后客户端使用a对象的某些方法来使用前面传参进来的策略,即客户端是通过a对象使用策略的。
简单的说,
1、工厂模式根据条件生产出产品给客户端用。而策略模式是客户端使用传参给Context的策略(你也可以理成产品),传入策略的不同,调用同样方法得到的结果也不同。
2、工厂模式:客户端是使用工厂类生产的对象进行操作,策略模式:客户端使用自己传给Context的策略的对象进行操作。
参考文章:
http://blog.csdn.net/zhangliangzi/article/details/52161211
https://www.cnblogs.com/langtianya/archive/2013/03/08/2950934.html
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 2017.12.05 数据库联表查询
- Python 从入门到实践 6-1 课后习题
- 输入和输出
- url-pattern / 与 /* 的区别
- 深度神经网络全面概述:从基本概念到实际模型和硬件基础
- 策略模式
- 高数 06.03 积分习题课03测试题
- 百度地图
- 性能测试应该关注的指标
- LeetCode 87. Scramble String
- JavaScript中类的继承有哪些方法(组合继承进阶)
- python basemap 画图案例
- 多线程练习
- ajax的post提交参数长度超出限制