linkin大话设计模式--策略模式

Strategy [ˈstrætədʒi]  策略



策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种算法,或者让Context来为客户端提供一个最佳的算法。说白了,使用策略模式就是为了支持算法的自由切换。


策略模式是对算法的包装,是吧使用算法的责任和算法本身分割开来,委派给不同的对象管理。
策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

一句话来形容:准备一组算法,并将每一个算法封装起来,使得他们可以互换。

策略模式涉及到三个角色:
环境角色:持有一个Strategy类(策略类)的引用
抽象策略角色:策略类,通常由一个接口或者抽象类实现
具体策略角色:包装了相关的算法和行为



代码如下:

//显示客户端 根据不同的策略选择 会有不能的实现算法来处理逻辑
public class Strategy {
private DiscountStrategy strategy; public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
} public double getDiscountPrice(double price){
if(null == strategy){
strategy = new VipDiscount();
}
return this.strategy.getDiscount(price);
} public static void main(String[] args) {
//这里的策略就可以在客户端随意修改和增加
//这里的客户端代码和不同的策略类耦合,我们可以考虑使用配置文件在指定Strategy到底使用哪种策略实现类 这样子其实就是hibernate的dialect...
Strategy strategy = new Strategy();
System.out.println(strategy.getDiscountPrice(100));
strategy.setStrategy(new OldDiscount());
System.out.println(strategy.getDiscountPrice(100));
strategy.setStrategy(new NewDiscount());
System.out.println(strategy.getDiscountPrice(100));
} } //算法的接口
interface DiscountStrategy{
public double getDiscount(double price);
} //下面几个是算法接口的实现 要是增加一个算法就增加一个实现就好 还是比较方便的
class VipDiscount implements DiscountStrategy{ @Override
public double getDiscount(double price) {
System.out.println("VIP折扣...");
return price*0.5;
} } class OldDiscount implements DiscountStrategy{ @Override
public double getDiscount(double price) {
System.out.println("老顾客折扣...");
return price*0.7;
} } class NewDiscount implements DiscountStrategy{ @Override
public double getDiscount(double price) {
System.out.println("新顾客折扣...");
return price*0.9;
} }


























































linkin大话设计模式--策略模式的更多相关文章

  1. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  2. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  3. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  4. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  5. linkin大话设计模式--门面模式

    linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...

  6. linkin大话设计模式--命令模式

    linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...

  7. 大话设计模式--策略模式 strategy -- C++实现实例

    1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...

  8. linkin大话设计模式--代理模式

    代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端并不关心是否可以准确的得到这个对象,他只要一个能够提供该功能的对象而已,此时我们就可以返回该对象的代理.总而言之,客户端 ...

  9. linkin大话设计模式--单例模式

    linkin大话设计模式 开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到.设计模式的概念最早源于建筑设计大师<建筑的永恒算法>一书,它表 ...

随机推荐

  1. bootstrapru软件官网

    一    bootstrap:http://v3.bootcss.com/ 二   起步:http://v3.bootcss.com/getting-started/ 三    全局css样式:htt ...

  2. 记一次使用Node.js electron打包网站的记录

    具体步骤请参考:http://blog.csdn.net/a727911438/article/details/70834467 打包时出现了不少问题,逐一记录下来以供其他人参考. package.j ...

  3. Check whether a remote server port is open on Linux

    链接:https://www.pixelstech.net/article/1514049471-Check-whether-a-remote-server-port-is-open-on-Linux

  4. 有关求任意一个正整数的n的因数的个数的求解思路

    已知条件:n=p1^a1xp2^a2xp3^a3........xpk^ak;求解n的因数的个数: 求解的主要思想:递归 设所有的因数的个数为U1: 则U1会等于什么呢? 不妨设求得p2^a2xp3^ ...

  5. Updates were rejected because the remote contains work that you do(git报错解决方案)

    Updates were rejected because the remote contains work that you do(git报错解决方案) 今天向GitHub远程仓库提交本地项目文件时 ...

  6. .NET使用Office Open XML导出超大数量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  7. 在ASP.NET Core 2.0中使用MemoryCache

    说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...

  8. LeetCode第[4]题(Java):Median of Two Sorted Arrays 标签:Array

    题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...

  9. 数据结构-二叉树(应用篇)-之二叉搜索树 C和C++的实现

    一.概念 二叉搜索树(Binary Sort Tree/Binary Search Tree...),是二叉树的一种特殊扩展.也是一种动态查找表. 在二叉搜索树中,左子树上所有节点的均小于根节点,右子 ...

  10. Linux系统调用过程

    1 系统调用的作用 系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作.用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等. 应用程序 ...