java 策略模式
《Head First 设计模式》学习中
设计原则
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
 - 针对接口编程,而不是针对实现编程
 - 多用组合少用继承
 
策略模式
- 定义算法族,分别封装起来,让他们可以互相替换,此模式让计算的变化独立于使用算法客户
 

这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
书中的例子是鸭子,感觉怪怪的, 换个说法、
最近楼下开了一个凤凰门火锅店,路口发的传单都是他们店内的,拿它举下例子吧。
抽象策略类
package com.strategy;
/**
* 抽象策略类 接口
* @author Administrator
*
*/
public interface Price {
/**
* 策略方法 计算金额
* @param money RMB
*/
void calcPrice (double money);
}
具体策略类
package com.strategy;
public class sevenDay implements Price{
	@Override
	public void calcPrice(double money) {
		System.out.println("开业7天五折!!");
		System.out.println("您的消费为" + money * 0.5 + "RMB");
	}
}
package com.strategy;
public class FifteenDay implements Price {
	@Override
	public void calcPrice(double money) {
		System.out.println("开业15天7.8折");
		System.out.println("您的消费为" + money * 0.78 + "RMB");
	}
}
package com.strategy;
public class ThirtyDay implements Price {
	@Override
	public void calcPrice(double money) {
		System.out.println("优惠时间已过!");
		System.out.println("您的消费为" + money  + "RMB");
	}
}
环境角色类
package com.strategy;
/**
* 环境角色类
* @author Administrator
*
*/
public class Strategy {
//具体策略的对象
private Price price ; //构造方法,传入一个策略对象
public Strategy(Price price){
this.price = price;
} //策略方法
public void show(double money){
this.price.calcPrice(money);
}
}
测试类
package com.strategy;
public class TestPrice {
    public static void main(String[] args) {
        //选择并创建需要使用的策略对象
        Price price = new sevenDay();
        //创建环境
        Strategy strategy = new Strategy(price);
        //调用方法计算价格
        strategy.show(324);
        //选择并创建需要使用的策略对象
        Price price1 = new FifteenDay();
        //创建环境
        Strategy strategy1 = new Strategy(price1);
        //调用方法计算价格
        strategy1.show(276);
        //选择并创建需要使用的策略对象
        Price price2 = new ThirtyDay();
        //创建环境
        Strategy strategy2 = new Strategy(price2);
        //调用方法计算价格
        strategy2.show(0);
    }
}
计算结果
开业7天五折!!
您的消费为162.0RMB
开业15天7.8折
您的消费为215.28RMB
优惠时间已过!
您的消费为0.0RMB
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
参考引用博客为 http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html 侵权必删
java 策略模式的更多相关文章
- JAVA策略模式
		
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...
 - Java策略模式(Strategy模式) 之体验
		
<JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...
 - Java策略模式以及来自lambda的优化
		
前言 设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...
 - java策略模式(及与工厂模式的区别)
		
按一般教程中出现的例子理解: 简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用.即客户端使用的是工厂类生产的产品对象. 策略模式:客户端 ...
 - Java策略模式(Strategy)
		
一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...
 - java策略模式拙见
		
面向对象的两个基本准则: 单一职责:一个类只有一个发生变化的原因 开闭原则:对拓展开放,对修改关闭 <Java开发手册>中,有这样的规则:超过3层的 if-else 的逻辑判断代码可以使用 ...
 - Java 策略模式和状态模式
		
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
 - java - 策略模式、状态模式、卫语句,避免多重if-else(转)
		
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
 - Java 策略模式(Strategy)
		
创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...
 
随机推荐
- SVN解决冲突的方法
			
SVN管理代码工具在群组合作开发的过程中,若多人同时修改一个文件,就会出现冲突的情况. 冲突演示: 有A.B两个用户,他们各自从svn服务器中检出了file.txt文件,此时A.B.服务器三个地方的f ...
 - symfony4 404页面未找到
			
symfony4 404页面未找到 安装好symfony4后,发现除了首页能正常显示,其他页面如/_profiler_/等其他创建的router访问都显示The requested URL /xxx ...
 - [转] spark-submit 提交任务及参数说明
			
[From] https://www.cnblogs.com/weiweifeng/p/8073553.html#undefined spark-submit 可以提交任务到 spark 集群执行,也 ...
 - 【实战】Weblogic反序列化Getshell
			
修仙就是干,直接操作起来 1.访问http://x.x.x.x:7001/wls-wsat/CoordinatorPortType 2.加入Content-Type:text/xml 3.在body中 ...
 - DB2 命令大全
			
check Archiving processing 查看日志归档情况 db2 "SELECT DATE(CAST(START_TIME as TIMESTAMP)) as DATE, co ...
 - (转)mysql、innodb和加锁分析
			
mysql.innodb和加锁分析 原文:https://liuzhengyang.github.io/2016/09/25/mysqlinnodb/ 介绍 本文主要介绍MySQL和InnoDB存储引 ...
 - $scope作用域与依赖注入
			
一.$scope与$rootscope作用域 $scope下的数据作为该控制器下的数据moduel,只有在该控制器下才能够访问:而$rootScope则可以可以再任何有效的地方访问到,这个有效的地方指 ...
 - django notes 六:数据库 CRUD 操作
			
CRUD 也没什么可说的,django 提供了完善的 orm api, 直接用就行了. 我只贴几个列子,一看就明白了,自己再用用就熟了. # create b = Blog(name='Beatle ...
 - 算法之经典排序-冒泡排序(bubble sort)
			
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元 ...
 - VSCode基本配置
			
功能:保存时自动按ESLint规范格式化代码 + stylus配置(需安装Manta's Stylus Supremacy插件) { "editor.fontSize": 18, ...