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样例的更多相关文章

  1. java文件夹相关操作 演示样例代码

    java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...

  2. 设计模式之策略模式&amp;简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  3. JavaScript设计模式 样例二 —— 策略模式

    策略模式(Strategy Pattern): 定义:定义了一族算法: 封装了每个算法: 这族的算法可互换代替. 目的:将算法的使用与算法的实现分离开来. 场景:可用来消除大量的条件分支语句. 例:J ...

  4. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

  5. Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...

  6. Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)

    导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...

  7. Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例

    MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...

  8. MVC模式编程演示样例-登录验证(静态)

    好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...

  9. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

随机推荐

  1. POJ2782:Bin Packing

    Description   A set of n<tex2html_verbatim_mark> 1-dimensional items have to be packed in iden ...

  2. Jetty支持Windows认证

    WAFFLE是什么? Jetty增加WAFFLE支持 DEMO 小结 WAFFLE是什么? WAFFLE是一个Windows认证框架,支持Negotiate, NTLM和Kerberos认证.WAFF ...

  3. 【Demo 0003】Android 事件

    本章学习要点:        1.  了解Android中资源用途:        2.  掌握资源使用通用规则:        3.  掌握具体资源使用方法;

  4. iOS基本控制-UINavigationController 传统的价值观,代理传统价值观,正向传统价值观,反传统的价值观

    /*        程序过程:  1.创建一个根视图,一个二级视图  2,根视图NavigationItem.title = Root 二级视图NavigationItem.title = Secon ...

  5. Linux内核参数信息(Oracle相关)

    命令行:vim  /etc/sysctl.conf 查看如下两行的设置值,这里是: kernel.shmall = 2097152 kernel.shmmax = 4294967295 如果系统默认的 ...

  6. 在toolbar里动态创建多个button(ext.net)

    private void setOneMenu() { string sql = "select id,name,gids from Config where name<>'高级 ...

  7. js基础语法(一)

    学习网站参考:http://www.w3school.com.cn/ 写入html输出: document.write('test out put'); 例子: http://www.w3school ...

  8. hadoop format过程

    private static boolean format(Configuration conf, boolean isConfirmationNeeded ) throws IOException ...

  9. hdu 4715

    #include<stdio.h> #include<string.h> int prime[1100000],p[1000000],ans; void pri() {     ...

  10. 模仿《百度音乐HD》添加到下载框动画

    上次听有人说喜欢<百度音乐HD>添加到下载动画 ,我就尝试模仿了下,没想到,今天code4app(地址)也有了这个,但是 这个动画基本相同,我们的思路还是部一样的. 都可以参考 .主要关键 ...