• 策略模式——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: 在此加入�控件通知处理程序代码
    }
    

    參考资料:程杰 《大话设计模式》

  • 相关阅读:
    weblogic无需用户名密码启动Server
    中文和unicode互转
    spring集成activeMQ
    jvm分析(MD语法)
    解决java.lang.NoClassDefFoundError: org/apache/log4j/Level
    httpclient 支持代理和http & https
    容器配置jndi Tomcat为例
    java https tomcat 单双认证(含证书生成和代码实现) 原创转载请备注,谢谢O(∩_∩)O
    java Http原生 Get 和Post 支持代理认证
    解决客户端访问https报错
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4015596.html
Copyright © 2020-2023  润新知