JAVA设计模式 之 策略模式
一. 定义
设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式)。
二. 应用场景
当我们在应用程序中完成一项功能时,有些需要经常变化的算法我们需要就独立的抽取出来,将使用抽象的引用为在具体的功能类中标示,并且在程序运行时能够动态的改变这些算法功能。
三. 设计原则
设计模式告诉我们:
(1). 找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
(2). 要针对接口编程,而不是针对实现的编程。
(3). 多用组合,少用继承。
四. 举例说明
假如某超级市场有这样的会员打折行为,会员分为三个等级,这里就用A,B,C来替代,会员A具有一种算法,会员B具有一种算法,会员C也具有一种算法。因为以后可能有更多的会员计算方法或者按不同节日为会员打折等,使用JAVA我们一般的做法是创建一个类,在类中判断如果是会员A我们就按照一种计算方法结账,如果是会员B我们就会用另外以一种方法结账,如果是会员C我们在用一种结账算法,这样呢这个类中就多了很多if ... else 判断,并且这个方法相当的长,问题就暴露出来了,日后你可能不愿意维护这样的代码,但是有的人说了,我把不同的算法都提出来为一个方法不行行了吗?恩,很对,那么在if...else里面就可以减少代码量了,可是如果超级市场有新增加了新的会员,或者会员算法需要修改的时候,问题是不是又来了,所以为了使日后维护方便,做到最少的修改,即满足开闭原则,这里使用策略模式来解决该问题。
策略模式解决该问题的思路是将具体的不同的会员算法提出来作为一个类,然后呢实现一个统一的接口,这样在日后增加了一个会员算法,只需要添加一种实现而已,然后在超市的这个类中持有这个会员算法的接口引用即可。
封装行为类图:
具体看如下代码:
1. 会员结账接口 ISettleAccounts.java
/**
* 会员结账接口
* @author Administrator
*/ public interface ISettleAccounts { /**
* 计算账目
* @return
*/
public double calculate(double reallyPrice);
}
2. 会员A打折算法 MemberA.java 继承统一的会员结账接口
public class MemberA implements ISettleAccounts { public double calculate(double reallyPrice) { System.out.println("MemberA 的账目计算方法[9折计算]....."); return reallyPrice * 90/100;
} }
3. 会员B打折算法 MemberB.java 继承统一的会员结账接口
public class MemberB implements ISettleAccounts { public double calculate(double reallyPrice) { System.out.println("MemberB 的账目计算方法[8.5折计算]....."); return reallyPrice * 85/100;
} }
3. 会员C打折算法 MemberC.java 继承统一的会员结账接口
public class MemberC implements ISettleAccounts { public double calculate(double reallyPrice) { System.out.println("MemberA 的账目计算方法[8折计算]....."); return reallyPrice * 80/100;
} }
4. 超级市场类Supermarket.java
/**
* 超级市场
* @author Administrator
*/ public abstract class Supermarket { // 持有结账引用
private ISettleAccounts settleAccounts; // 其它的属性
// private ...... // 可以设置某一种会员打折类别,也就是在运行的时候可以改变某种会员计算方法
public void setSettleAccounts(ISettleAccounts settleAccounts) {
this.settleAccounts = settleAccounts;
} /**
* 打折计算
* @param reallyPrice
* @return
*/
public double discount(double reallyPrice){
return settleAccounts.calculate(reallyPrice);
} // 其它的方法
// public ...... }
5. 顾客会员A CustomerMemberA.java 类
在这个顾客类中只需要将会员A的算法动态的设置其中即可。当然你还可以创建顾客会员B,顾客会员C。。。。
/**
* 客户会员A
* @author Administrator
*/ public class CustomerMemberA extends Supermarket { // 构造客户会员A
public CustomerMemberA(){
super.setSettleAccounts(new MemberA());
} }
6. 测试类 CustomerMemberATest.java
/**
* 会员A来超级市场购物结账,并且实际消费是1200元
* @author Administrator
*/ public class CustomerMemberATest extends Supermarket { public static void main(String[] args) { // 创建客户会员A
CustomerMemberA customerMemberA = new CustomerMemberA();
System.out.println(customerMemberA.discount(1200)); } }
7. 运行测试结构
MemberA 的账目计算方法[9折计算].....
1080.0
JAVA设计模式 之 策略模式的更多相关文章
- Java设计模式1——策略模式(Strategy Pattern)
最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...
- Java设计模式之策略模式(一)
今年寒假没有回家,打算利用这个假期的时间进行学习设计模式,这一个人感觉比较牛的知识,前一段时间一直在忙着搞自己的专业课,还有就是捣鼓了一下Linux系统,没有好好的学习关于Java还有Android方 ...
- Java设计模式---Strategy策略模式
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...
- 折腾Java设计模式之策略模式
博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. ...
- Java 设计模式之 策略模式
思维导图: 我们先来看 STRATEGY 设计模式的通俗解释: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心, ...
- java设计模式之策略模式
策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图 策略模式代码 古代的各种计谋都是一种策略,这次我们 ...
- Java设计模式之-----策略模式
首先,我们来看下策略模式的概念.一般的解释如下: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...
- java设计模式之——策略模式
1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...
- 小白学习java设计模式之策略模式
策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...
随机推荐
- MooseFs-分布式文件系统系列(二)之安装总结
preface 上篇博客写了如何安装MFS,那么现在就说说经验总结把 安装方式有源码和yum安装,在官网地址:https://moosefs.com/download/centosfedorarhel ...
- Nginx与服务器集群在它的配置文件中的配置
- Python字典和集合
Python字典操作与遍历: 1.http://www.cnblogs.com/rubylouvre/archive/2011/06/19/2084739.html 2.http://5iqiong. ...
- mongodb嵌套查询
db.dbModel.find({'Missions.Rewards.PrizeType':21} )
- ubuntu14.04安装了im-switch后系统设置中不见了语言支持
sudo apt-get install language-selector-gnome
- Java数据结构——解析算术表达式
- Java——URLEncoder和URLDecoder
import java.net.URLDecoder; import java.net.URLEncoder; //========================================== ...
- LVS相关学习
vi /etc/sysctl.conf net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.c ...
- js 滚动加载iframe框中内容
var isIE6 = !!window.ActiveXObject&&!window.XMLHttpRequest; //滚动加载 var scrollLoad =function( ...
- 第五章:创建DbContext
一.DbContext介绍 DbContext是Entity Framework(EF)操作数据库的上下文网关(接口).我们对数据库的所有操作都是通过DbContext完成的.下面我们将讨论在code ...