《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 策略模式的更多相关文章

  1. JAVA策略模式

    <JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...

  2. Java策略模式(Strategy模式) 之体验

    <JAVA与模式>之策略模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法 ...

  3. Java策略模式以及来自lambda的优化

    前言    设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...

  4. java策略模式(及与工厂模式的区别)

    按一般教程中出现的例子理解: 简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,并return给客户端,供客户端使用.即客户端使用的是工厂类生产的产品对象. 策略模式:客户端 ...

  5. Java策略模式(Strategy)

    一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...

  6. java策略模式拙见

    面向对象的两个基本准则: 单一职责:一个类只有一个发生变化的原因 开闭原则:对拓展开放,对修改关闭 <Java开发手册>中,有这样的规则:超过3层的 if-else 的逻辑判断代码可以使用 ...

  7. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

  8. java - 策略模式、状态模式、卫语句,避免多重if-else(转)

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  9. Java 策略模式(Strategy)

    创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 /** * 策略接口 */ p ...

随机推荐

  1. 布局优化之ViewStub、Include、merge使用分析

    布局技巧 在Android开发过程中,我们会遇到很多的问题,随着UI界面越来越多,布局的重复性.复杂度也随之增加,所幸的是,Android官方也给出了几个对布局进行优化的方法,下面根据自己的理解对官方 ...

  2. nginx图片处理笔记(http-image-filter-module、lua)

    实验环境:CentOS 6.10 目标:1.使用http-image-filter-module进行图片变换:2.使用lua进行格式转换: 安装EPEL https://fedoraproject.o ...

  3. 关于语法节点Tree、类型Type和符号Symbol

    每个语法节点Tree都有Type属性,部分的语法节点有Symbol属性,如下: 与Symbol类型与Type类型之间的关系如下: 下面是Symbol与Type之间的关系: (1)MethodSymbo ...

  4. MySQL的连接方式

    连接MySQL操作是连接进程和MySQL数据库实例进行通信.从开发的角度来说,本质上是进程通信.常用的进程通信方式有管道.命名管道.命名字.TCP/IP套接字.Unix域名套接字.MySQL提供的连接 ...

  5. Intel万兆网卡背靠背连接ping不通那点事儿

    对那些整天喊着“玩大的,玩狠的”口号的人来说,我下面要说的这点事儿,根本就不算事儿.所以,如果你正好喜欢喊口号,就不要往下看了,因为我要讲述的,你可能不感兴趣,也可能看不懂. 今天,是我加入I公司3个 ...

  6. 图说使用socket建立TCP连接

    在网络应用如火如荼的今天,熟悉TCP/IP网络编程,那是最好不过.如果你并不非常熟悉,不妨花几分钟读一读. 为了帮助快速理解,先上个图,典型的使用socket建立和使用TCP/UDP连接过程为(截图来 ...

  7. centOS 7下无法启动网络(service network start)错误解决办法(应该是最全的了。。。)

    今天在centOS 7下更改完静态ip后发现network服务重启不了,翻遍了网络,尝试了各种方法,终于解决了. 现把各种解决方法归纳整理,希望能让后面的同学少走点歪路... 首先看问题:执行serv ...

  8. ajax 传递数组给后台.net MVC 控制器

    数组结构为: [ "5ae92c2786f3591b2cff1be5", "5ae91bb7ca673569a8d23a6e" ] 前台代码: $.ajax({ ...

  9. Postgresql 连接更新

    update dbo.m_role_fun a set role_code = b.rsc from (select rsc, fun_code from dbo.m_fun) b where a.f ...

  10. 什么是SSH

    SSH不仅实现了视图.控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离,耦合度降低,系统的灵活性更好,可复用性高 官方的说法:SSH是 struts+spring+hibernate的一个 ...