策略模式——MFC样例
Context(应用场景):
1、须要使用ConcreteStrategy提供的算法。
2、内部维护一个Strategy的实例。
3、 负责动态设置执行时Strategy详细的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(详细策略类):
2、 实现了Strategy定义的接口,提供详细的算法实现。
UML类图:
MFC样例实现关键类代码:
// STRATEGY_MFCDlg.cpp : 实现文件
// #include "stdafx.h"
#include "STRATEGY_MFC.h"
#include "STRATEGY_MFCDlg.h"
#include "afxdialogex.h" #ifdef _DEBUG
#define new DEBUG_NEW
#endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx
{
public:
CAboutDlg(); // 对话框数据
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现
protected:
DECLARE_MESSAGE_MAP()
}; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
} void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
} BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP() // CSTRATEGY_MFCDlg 对话框 CSTRATEGY_MFCDlg::CSTRATEGY_MFCDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSTRATEGY_MFCDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
} void CSTRATEGY_MFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_PRICE, m_Edit_Price);
DDX_Control(pDX, IDC_EDIT_NUM, m_EditNum);
DDX_Control(pDX, IDC_EDIT_SHOW, m_EditShow);
DDX_Control(pDX, IDC_COMBO1, m_ComboBoxComp);
DDX_Control(pDX, IDC_EDIT_TOTAL, m_EditTotal);
} BEGIN_MESSAGE_MAP(CSTRATEGY_MFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_SURE, &CSTRATEGY_MFCDlg::OnBnClickedButtonSure)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CSTRATEGY_MFCDlg::OnBnClickedButtonClear)
END_MESSAGE_MAP() // CSTRATEGY_MFCDlg 消息处理程序 BOOL CSTRATEGY_MFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项加入�到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗体不是对话框时,框架将自己主动
// 运行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此加入�额外的初始化代码
m_ComboBoxComp.AddString(_T("正常收费"));
m_ComboBoxComp.AddString(_T("打八折"));
m_ComboBoxComp.AddString(_T("满300元返100元")); total=0.0;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
} void CSTRATEGY_MFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
} // 假设向对话框加入�最小化button,则须要以下的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自己主动完毕。 void CSTRATEGY_MFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
} //当用户拖动最小化窗体时系统调用此函数取得光标
//显示。
HCURSOR CSTRATEGY_MFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
} void CSTRATEGY_MFCDlg::OnBnClickedButtonSure()
{
// TODO: 在此加入�控件通知处理程序代码
//取单位价格
CString strPrice;
double price=0.0;
m_Edit_Price.GetWindowTextW(strPrice);
//strPrice.Format(_T("%.2f"),price);
m_strShow=m_strShow+strPrice+_T(" ");
price=_ttof(strPrice);
//取数量
CString strNum;
double num=0.0;
m_EditNum.GetWindowTextW(strNum);
//strNum.Format(_T("%.2f"),num);
m_strShow+=strNum+_T(" ");
num=_ttof(strNum);
//取计算方式
CString strComp;
//m_ComboBoxComp.SetCurSel(1);
int nIndex=m_ComboBoxComp.GetCurSel();
m_ComboBoxComp.GetLBText(nIndex,strComp);
m_strShow+=strComp;
//
CashContext* cc=NULL; if(strComp=="正常收费")
{
cc=new CashContext(new CashNormal());
}
else if(strComp=="满300元返100元")
{
cc=new CashContext(new CashReturn(_T("300"),_T("100")));
}
else if(strComp=="打八折")
{
cc=new CashContext(new CashRebate(0.8));
}
//
double totalPrice=0.0;
totalPrice=cc->GetResult(price*num);
total+=totalPrice;
CString strTemp;
strTemp.Format(_T("%.2f"),total);
m_EditTotal.SetWindowTextW(strTemp);
m_EditShow.SetWindowTextW(m_strShow);
} void CSTRATEGY_MFCDlg::OnBnClickedButtonClear()
{
// TODO: 在此加入�控件通知处理程序代码
}
參考资料:程杰 《大话设计模式》
策略模式——MFC样例的更多相关文章
- java文件夹相关操作 演示样例代码
java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- JavaScript设计模式 样例二 —— 策略模式
策略模式(Strategy Pattern): 定义:定义了一族算法: 封装了每个算法: 这族的算法可互换代替. 目的:将算法的使用与算法的实现分离开来. 场景:可用来消除大量的条件分支语句. 例:J ...
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
- Android中MVP模式与MVC模式比較(含演示样例)
原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...
- Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)
导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...
- Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例
MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...
- MVC模式编程演示样例-登录验证(静态)
好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
随机推荐
- POJ2782:Bin Packing
Description A set of n<tex2html_verbatim_mark> 1-dimensional items have to be packed in iden ...
- Jetty支持Windows认证
WAFFLE是什么? Jetty增加WAFFLE支持 DEMO 小结 WAFFLE是什么? WAFFLE是一个Windows认证框架,支持Negotiate, NTLM和Kerberos认证.WAFF ...
- 【Demo 0003】Android 事件
本章学习要点: 1. 了解Android中资源用途: 2. 掌握资源使用通用规则: 3. 掌握具体资源使用方法;
- iOS基本控制-UINavigationController 传统的价值观,代理传统价值观,正向传统价值观,反传统的价值观
/* 程序过程: 1.创建一个根视图,一个二级视图 2,根视图NavigationItem.title = Root 二级视图NavigationItem.title = Secon ...
- Linux内核参数信息(Oracle相关)
命令行:vim /etc/sysctl.conf 查看如下两行的设置值,这里是: kernel.shmall = 2097152 kernel.shmmax = 4294967295 如果系统默认的 ...
- 在toolbar里动态创建多个button(ext.net)
private void setOneMenu() { string sql = "select id,name,gids from Config where name<>'高级 ...
- js基础语法(一)
学习网站参考:http://www.w3school.com.cn/ 写入html输出: document.write('test out put'); 例子: http://www.w3school ...
- hadoop format过程
private static boolean format(Configuration conf, boolean isConfirmationNeeded ) throws IOException ...
- hdu 4715
#include<stdio.h> #include<string.h> int prime[1100000],p[1000000],ans; void pri() { ...
- 模仿《百度音乐HD》添加到下载框动画
上次听有人说喜欢<百度音乐HD>添加到下载动画 ,我就尝试模仿了下,没想到,今天code4app(地址)也有了这个,但是 这个动画基本相同,我们的思路还是部一样的. 都可以参考 .主要关键 ...