设计模式之Strategy模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具体的共同接口的独立类中,从而使得他们可以互相替换。
策略模式使得算法可以在不影响客户端的情况下发生变化。
all in one “准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
三个角色:
环境context角色:持有一个Strategy的引用
策略接口角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
策略角色:包装了相关的算法或行为
环境角色:
package com.yzf.pattern.strategy; /**
* 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
* 在每一个时刻只能使用一个具体的策略实现对象
* @author luozuzu
*
*/
public class Price {
//持有一个具体的策略对象
private MemberStrategy memberStrategy; /**
* 构造函数,传入一个具体的策略对象
* @param memberStrategy
*/
public Price( MemberStrategy memberStrategy){
this.memberStrategy = memberStrategy;
} public double quote(double price){
return this.memberStrategy.calcPrice(price);
}
}
接口类:
package com.yzf.pattern.strategy; //策略接口
public interface MemberStrategy {
public double calcPrice(double price);
}
策略实现类
package com.yzf.pattern.strategy;
public class FirstMemberStrategy implements MemberStrategy {
//具体策略算法1
public double calcPrice(double price) {
System.out.println("对于初级会员的没有折扣");
return price;
}
}
package com.yzf.pattern.strategy;
public class SecondMemberStrategy implements MemberStrategy {
//具体策略算法2
public double calcPrice(double price) {
System.out.println("对于中级会员的折扣为10%");
return price * 0.9;
}
}
package com.yzf.pattern.strategy;
public class ThirdMemberStrategy implements MemberStrategy {
//具体策略算法3
public double calcPrice(double price) {
System.out.println("对于高级会员的折扣为20%");
return price * 0.8;
}
}
客户端
package com.yzf.pattern.strategy;
public class Client {
public static void main(String[] args) {
//MemberStrategy ms = new FirstMemberStrategy();
//MemberStrategy ms = new FirstMemberStrategy();
MemberStrategy ms = new SecondMemberStrategy();
Price p = new Price(ms);
double quote = p.quote(300);
System.out.println(quote);
}
}
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
设计模式之Strategy模式的更多相关文章
- 设计模式:strategy模式
思想:将算法进行抽象,然后使用桥接的模式使用算法的抽象接口,达到算法整体替换的目的 理解:和桥接模式相同,只是桥接的两边分开的思想不同 例子: class Algrithm //算法的抽象 { pub ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- C++设计模式---Strategy模式
一.前言 学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~ Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户.Strategy模式将 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 设计模式---组件协作模式之策略模式(Strategy)
一:概念 Strategy模式,对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略). Strategy模 ...
- 转-PHP 设计模式 之策略模式 应用场景 Strategy Pattern
一.前言 关于设计模式的文章,园子里实在是太多太多,而且讲解的也非常精彩,那为什么我还要在这里记录下这篇文章?本文以实际项目应用“自己动手写工具--XSmartNote”为切入点,来讲述策略模式的应用 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- 设计模式之——浅谈strategy模式(策略模式)
strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...
- Strategy Pattern ava设计模式之策略模式
简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...
随机推荐
- [FORWARD]ODBC 各种数据库连接串
Overview Generally, one of the first steps when you are trying to work with databases is open it. Yo ...
- input输入框限制(座机,手机号码)
记录一下 座机input输入框: <input style="width:100px;" id="tel" type="text" o ...
- VPS虚拟化架构OpenVZ、KVM、Xen、Hyper-V的区别
1.OpenVZ OpenVZ(简称OVZ)采用SWsoft的Virutozzo虚拟化服务器软件产品的内核,是基于Linux平台的操作系统级服务器虚拟化架构.这个架构直接调用宿主机(俗称:母机)中的内 ...
- js中获取css样式的两种方式
1. 对象.style.样式名 弊端就是只能获取行内样式 2.window.getComputedStyle(对象,null); 最好用第二种方式 <!DOCTYPE html> < ...
- vmware 虚拟机导入OVF出现路径错误
现状: 需要将原有数据中心的VM虚拟机导出本地OVF模板,然后迁移至新的机房虚拟化环境后从新导入. 问题: 导入OVF时候,先出现错误问题1,修复完成后,出现错误问题2 1. OVF迁移至本地以后,导 ...
- Climbing Stairs 爬楼梯问题,每次可以走1或2步,爬上n层楼梯总方法 (变相fibonacci)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 【眼见为实】自己动手实践理解数据库REPEATABLE READ && Next-Key Lock
[REPEATABLE READ] 首先设置数据库隔离级别为可重复读(REPEATABLE READ): set global transaction isolation level REPEATAB ...
- 毕向东_Java基础视频教程第20天_IO流(1~4)
第20天-01-IO流(File概述) File类: 用来将文件或者文件夹封装成对象, 方便进行操作. File对象可以作为参数, 传递给流对象的构造函数. 流对象不能操作文件夹; 流对象不能操作文件 ...
- SqlServer 批量添加记录
declare @i int ) begin INSERT INTO [dbo].[Settlements] ([ID] ,[Count] ,[SettlementDate]) VALUES ( ne ...
- CALayer动画的暂停,恢复,以及结束时候的回调
CALayer动画的暂停,恢复,以及结束时候的回调 源码如下: // // ViewController.m // AnimationLineView // // Created by YouXian ...