当前位置: 首页 > 编程日记 > 正文

策略模式 极其简单的列子

第一篇博客

本文来自 自己老师 的博客 http://blog.csdn.net/lovelion/article/details/7818983

题目:某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:

      (1) 学生凭学生证可享受票价8折优惠;

      (2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);

      (3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。

      该系统在将来可能还要根据需要引入新的打折方式

1.要满足开闭原则 二话不说先定义抽象类或接口

namespace StrategyTest
{/// <summary>/// 抽象策略类  (折扣类)/// </summary>public  interface IAbsStrategy{/// <summary>/// 打折 抽象方法(用拼音。。)/// </summary>/// <param name="price">价格</param>/// <returns>double</returns>double DaZhe(double price);}
}

2.年龄在十岁以下-10元

namespace StrategyTest
{public class ChildrenDaZhe:IAbsStrategy{/// <summary>/// 儿童减10元/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("儿童价:");return price - 10;}}
}

3.学生打八折

namespace StrategyTest
{public  class StudentDaZhe:IAbsStrategy{/// <summary>/// 学生8折/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("学生价:");return price * 0.8;}}
}


4.VIP打5折

namespace StrategyTest
{public class VIPDaZhe:IAbsStrategy{/// <summary>/// VIP打5折 积分增加/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("VIP价格:");Console.Write("积分增加 +1  \r\n");//积分这里意思一下。。。return price * 0.5;}}
}

namespace StrategyTest
{/// <summary>/// 电影票 环境类/// 提供两个注入方法(注入为抽象类) 1.构造函数注入 2.方法注入/// </summary>public class MovieTicket{private IAbsStrategy abs;//抽象打折private double price;//价格public MovieTicket(){}//构造注入public MovieTicket(IAbsStrategy abs){this.abs = abs;}public double Price{get { return price; }set { price = value; }}//方法注入public void SetStrategy(IAbsStrategy myAbs){this.abs = myAbs;}/// <summary>/// 获取打折后的价格/// </summary>/// <returns></returns>public double GetPrice(){return abs.DaZhe(price);}}
}

<?xml version="1.0" encoding="utf-8" ?>
<configuration><appSettings><add key="Srtiategy" value="StrategyTest.ChildrenDaZhe"></add></appSettings>
</configuration>

namespace StrategyTest
{class Program{static void Main(string[] args){string txt = ConfigurationManager.AppSettings["Srtiategy"].ToString();//读取配置文件IAbsStrategy abs = Assembly.Load("StrategyTest").CreateInstance(txt) as IAbsStrategy;//创建实例
MovieTicket move = new MovieTicket(abs);//电影票类 环境类(构造注入)move.Price = 30;//设置原始价格//move.SetStrategy(abs);//方法注入double myPrice= move.GetPrice();//获取价格Console.Write("原始价为:"+move.Price);Console.Write("打完折为:" + myPrice);Console.Read();}}
}

结果: 儿童价: 原始价为:30打完折为:20

如果需要修改为VIP打折  则在配置文件中修改

这是我的第一篇文章,说实话没什么技术含量,写的也很烂。。。。,设计模式挺重要的,所以现在复习下,马上毕业了,希望能有个好的开始,

转载于:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999422.html

相关文章:

Git使用指南

1.创建目录 $ git config --global user.name "Your Name Comes Here" $ git config --global user.email youyourdomain.example.com $ git config --list 查看相关信息 $ git init 如果作为 Server 存在&#xff0c;那么可以忽略工作目录&#xff0c;以纯代码仓库形…

【Linux】Linux简单操作之安装、使用tomcat

tomcat安装 1、下载tomcat到指 文件夹 &#xff1a; home / local 中 2、将文件见解压到文件夹 &#xff1a;usr / local 当中 代码实现 &#xff1a; tar -zxvf -C /usr/local tomcat使用 1、进入到bin目录下&#xff0c;找到文件startup.sh 注&#xff1a; 是tomcat文件…

男人约会动机大揭秘。

被人约是好事&#xff0c;但也要眼明心亮&#xff0c;男人约会动机大揭秘。 男人约会动机大揭秘&#xff1a; 1&#xff1a;这是一个有诚意的开始&#xff0c;表明他是早有计划和你约会的。至少&#xff0c;也说明他有相当的社交礼貌。 2&#xff1a;这个男人可能只是一时寂寞了…

WebService之soap类型的服务和rest类型的服务

1.引言 WebService顾名思义就是web服务&#xff0c;web服务主要有两种&#xff0c;一种是基于soap类型的服务&#xff0c;一种是基于rest类型的服务&#xff0c;其中soap类型的服务有两种版本&#xff0c;一种是soap1.1版本&#xff0c;一种是soap1.2版本&#xff0c;soap服务类…

【二级java】二叉树序列

https://www.cnblogs.com/caozengling/p/5318504.html

Qt/Linux 下的摄像头捕获(Video4Linux2)

Linux下使用各种设备是一件令人兴奋的事情。在Unix的世界里&#xff0c;用户与硬件打交待总是简单的。最近笔者在Linux下搞了摄像头的开发&#xff0c;有一点感想发于此处。 Linux中操作一个设备一般都是打开&#xff08;open&#xff09;&#xff0c;读取&#xff08;read&…

ubuntu chm文档阅读器

一,chm阅读器名称 KchmViewer 安装方法 sudo apt-get install kchmviewer 使用 kchmviewer #非root用户可以直接使用 转载于:https://www.cnblogs.com/jiangfeilong/p/11184226.html

c++语言中,vector容器与list容器的区别和联系?_百度知道

C STL 提供了3个序列容器 &#xff1a;vector, deque, list vector 中的元素是顺序存放的&#xff0c;所以随机访问很快,但是要插入和删除&#xff0c;这个时间复杂度就很高了&#xff0c;vector初始化时有一个capacity,如果元素个数超出capacity,那vector就会重新分配一个新的…

《Java技术》第三次作业--面向对象——继承、抽象类、接口

1.阅读下面程序&#xff0c;分析是否能编译通过&#xff1f;如果不能&#xff0c;说明原因。应该如何修改&#xff1f;程序的运行结果是什么&#xff1f;为什么子类的构造方法在运行之前&#xff0c;必须调用父 类的构造方法&#xff1f;能不能反过来&#xff1f; class Grandp…

《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

新手入门&#xff1a;C/C中枚举类型(enum)   如果一个变量你需要几种可能存在的值&#xff0c;那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。   举个例子来说明一吧&#xff0c;为了让大家更明白一点&…

【二级java】 二分法查找

例题1 &#xff1a;对长度为n的线性表进行顺序查找&#xff0c;在最坏情况下所需要的比较次数为______。 解析&#xff1a; 如果线性表中的第一个元素就是被查找元素&#xff0c;则只需做一次比较就查找成功 查找次数为1 如果线形表中不存在该数据&#xff0c;查找次数为n 例…

List和ObservableCollection的相互转化

在WPF &#xff0c; silverlight &#xff0c;WP7中经常会用到List<T>和ObservableCollection<T>。这里简单讲一下他们之间的相互转换。 1.List<T>的简单介绍&#xff1a; List<T>代表的是强类型的Ojbect集合&#xff0c;可以通过索引访问并且提供了查…

获取局域网打印机列表

/// <summary> /// 获取局域网打印机列表 /// </summary> /// <param name"DefaultPrinter">默认打印机</param> /// <returns>局域网中所有打印机列表</returns> public static List&…

戏说 .NET GDI+系列学习教程(三、Graphics类的应用_验证码)

关于Graphics也有了基本了解下面想说的的是学这个东东干什么呢&#xff0c;到底如何应用目前常见应用1、验证码&#xff08;参照网上的&#xff09;2、打印排版&#xff08;会提到关于条形码大小设置&#xff09;3、自定义控件 一、验证码 1 class ValidateCode2 {3 …

转载:HBuilder常用快捷键

原文&#xff1a;http://www.cnblogs.com/DCL1314/p/8625110.htmlHBuilder常用快捷键1.文件新建 Ctrl N 关闭 Ctrl F4 全部关闭 Ctrl Shift F4 属性 Alt Enter 2.编辑激活代码助手 Alt / 激活快捷键视图 Ctrl Shift L开启关闭注释整行 Ctrl / 开启关闭注释已选内容 Ct…

java源程序结构

JAVA培训 一个完整的java源程序应该包括下列部分&#xff1a;  package语句&#xff1b; //该部分至多只有一句&#xff0c;必须放在源程序的第一句  import语句&#xff1b; /*该部分可以有若干import语句或者没有&#xff0c;必须放在所有的          类定义之前…

【二级java】排序技术

例题1 &#xff1a;希尔排序属于下列哪种排序法 解析&#xff1a; 希尔排序法的基本思想是&#xff1a; 将整个无序序列分割成若干小的子序列分别进行插入排序&#xff0c;所以属于插入排序 例题2 &#xff1a; 在下列几种排序方法中&#xff0c;要求内存量最大的是 解析&am…

HDU 1257 - 最少拦截系统 ( LIS / 贪心 )

题目 现在有一种拦截系统&#xff0c;第一发拦截可以是任意高度&#xff0c;但是之后的拦截高度不能比上次高。为了拦截下所有的炮弹&#xff0c;最少需要准备几套拦截系统&#xff1f; 思路 可能是语文没学好吧&#xff0c;一开始被题意卡了一下。&#xff08;而且题目连数据范…

python练习:猜价钱小游戏

#猜价钱 trueprice 202 price input("Please guess the price:") while (int(price) ! trueprice):if(int(price) > trueprice):price input("Your price is higher,Please try again:")else:price input("Your price is lower,Please try aga…

android系统短信库的一些用法

1、查询所有短信&#xff0c;按发件人进行分组Cursor mCursor managedQuery(Uri.parse("content://sms"),new String[] {"_id,address,date,read,status,type,body,count(address) as " "totleCount from (select _id,substr(address,4) as address,…

【二级java】操作题知识点积累

1、java中^代表亦或&#xff08;相同为0&#xff0c;不同为1&#xff09; 2、使用下标直接访问字符串中字符的方法 string.charAt&#xff08;&#xff09; 3、从主方法派出异常给jvm时 使用的是 throws 而不是 throw 4、使用InputStreamReader 、BufferedReader时需要使用的包…

Utilize Sql Tuning Advisor from Script

Sql Tuning Advisor是10g以后出现的一个十分有用的调优工具&#xff0c;大多数情况下我们可以通过dbconsole或者Grid Control的web界面调用SQL Advisor&#xff1b;但如果系统中没有配置dbconsole或者Grid Control的话&#xff0c;我们则需要通过手动调用DBMS_SQLTUNE PL/SQL程…

Isight 命令行运行任务

说明书参考:https://abaqus-docs.mit.edu/2017/English/DSSIMULIA_Established.htm 不一定对版本。但是大部分还可以。 不对的可以在命令里敲help 首先&#xff0c;说明书里的命令行客户端默认加入环境变量。 实测win/linux安装没有环境变量。可以自行添加也可找到目录自行运行…

【二级java】软件工程基础

1、软件工程三要素 &#xff1a; 方法 工具 过程 2、软件工程中根本上来说是为了研究软件开发技术 3、软件工程的定义 &#xff1a; 应用于计算机软件的定义、开发维护的一整套方法、工具、文档、实践标准和工序 4、软件危机的表现 &#xff1a; 软件的生命周期&#xff1a;…

ASP.NET WebAPI 11 参数验证

在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性. ModelState 在ApiController中一个ModelState属性用来获取参数验证结果. public abstract class ApiController : IHttpController, IDisposable{public ModelStateDictionary …

C#WinForm的线程及Invoke应用(转)

C#多线程异步访问winform中控件 http://zwkufo.blog.163.com/blog/static/25882512009111453957552/?fromdm&fromSearch&isFromSearchEngineyes 我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传…

C/C++语言点滴

C/C学习笔记 1.C语言中使用关键字sizeof来求数组长度 char temp[3]; int tempLen sizeof(temp)/sizeof(char); strlen只能用来求字符串长度 2.交换两个数据的几种方法及其区别 方法一&#xff1a;值传递&#xff0c;在main函数中并未改变a,b 的值&#xff0c;虽然在swap中a…

[C#][EF] 添加表添加不进来

确认此表有没有主键&#xff0c;没有主键时就会这样。转载于:https://www.cnblogs.com/z5337/p/8891230.html

DNN 数据访问策略 (转)

经过几天断断续续的努力&#xff0c;这篇文章终于翻译结束&#xff0c;文章主要讲了DNN的数据访问策略&#xff0c;对于了解系统整体上是如何工作的有一定的帮助&#xff0c;希望能给dnn的初学者一些有用的信息。由于翻译的匆忙水平有限&#xff0c;错误或不当之处在所难免&…

Windows程序设计学习笔记(1):一个简单的windows程序

《Windows程序设计》(第五版)(美Charles Petzold著) 1 #include<windows.h>2 3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);4 5 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdline,int iCmdShow) 6 //第一个参数是实例句柄&#…