策略模式 C++ 实现

策略模式 C++ 实现

#include<iostream>
#include<algorithm>
#include<string>
/*
  问题:和工厂模式的本质区别? 
*/ 
using namespace std;
/*abstract sort class --- strategy class*/
class super_sort
{ public:
  typedef int ElemType;
  void swap(ElemType *a,ElemType*b)
      {
        ElemType tmp;
        tmp=*a;
        *a=*b;
        *b=tmp;
       }
        
    
  virtual void sort(int *a,int l, int r)
  { }    
};

/* concrete sort --- concret strategy */

/*quicksort*/
class quick_sort: public super_sort
{ private: 
  typedef int ElemType;

int partition(int *a,int l,int r)
{ElemType v=a[r];
 int i=l-1;int j=r;
 while(i<j)
 {
 while(a[++i]>v&&i<r) ;
 while(j>l&&a[--j]<v) ;
 if(i>=j)  
   break;
  swap(&a[i],&a[j]);
 }
  swap(&a[i],&a[r]);
  
 return i;
}

void quicksort(int *a,int l,int r)
{ int i;
  if(l>=r) return;
  i=partition(a,l,r);
  quicksort(a,l,i-1);
  quicksort(a,i+1, r);
   
}
 public: 
  void sort(int *a, int l, int r)
  {
    quicksort(a,l,r);
         
  }    
    
};

/*insert sort*/ 

class insert_sort: public super_sort
{
  private:
  typedef int ElemType;
  void insertsort(ElemType *a,int l,int r) 
  {
    int i;
     for(i=1;i<r;i++)
	    if(a[i]<a[0]) swap(&a[0],&a[i]);
	     
	    for(i=l+2;i<r;i++)
	    {
	      int j=i;ElemType v=a[i];
		  while(v<a[j-1])
		  {a[j]=a[j-1];j--;}
		   a[j]=v;
	  
	     }
  }
  
  public:
        void sort(int *a,int l, int r)
        {
            insertsort(a,l,r);
        }  
};

/*direct sort*/

class direct_sort: public super_sort
{
  private:
void selectsort(int *a,int l,int r)
{int i,j;
 int flag=1;
  for(i=l;i<r;i++)
 {   int min=i;
	 for(j=i+1;j<10;j++)
	 {   
		 if(a[j]<a[min])
               min=j;
			   
	 }
	 swap(&a[i],&a[min]);
	 
 }
}
 
 public:
     void sort(int *a, int l, int r)
     {
          selectsort(a,l,r);  
     }    
            
};

/*context class*/

class context
{ 
  private:
  super_sort *my_sort;
  public:
     context(){};   
     void select_sort(int num,int *a, int l, int r)
     {
       switch(num)
       {
         case 1:
                my_sort = new quick_sort();
                break;    
        case 2:
            my_sort = new insert_sort();
            break;
        case 3:
            my_sort = new direct_sort();
            break;
        
        default:
            cout << "Erro input, please check. " << endl;
            
        }
        my_sort->sort(a, l, r); 
     }
     
    void sort_list()
    {
      cout <<"1 -------- quicksort ---------"<< endl;    
      cout <<"2 -------- insertsort ---------"<< endl;
      cout <<"3 -------- directsort ---------"<< endl;
      cout << "Input your choice: "<< endl;
    }
};

/*
   策略模式 和 简单工厂模式的 区别:
   简单工厂模式让客户端识别两个类,而策略模式只让客户端识别一个类;
   耦合更加低。
               
*/

/*client class*/
int main()
{   int num;
    int a[10] = {1,20,12,0,4,54,22,11,78,8};
    context my_selection;
    my_selection.sort_list();
    cin >> num;
    my_selection.select_sort(num,a,0,9);
    cout <<"-------- result ---------"<< endl;
    for(int i = 0; i < 10; i++)
      cout <<a[i]<< endl;
    
   system("pause"); 
   return 0;    
}

总结:无。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110104.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分布式事务TCC框架-hmily(spring cloud feign)

    分布式事务TCC框架-hmily(spring cloud feign)官网案例:文档(springcloud):https://dromara.org/zh/projects/hmily/user-springcloud/官网示例:https://github.com/dromara/hmily/tree/master/hmily-demo/hmily-demo-springcloud本示例:https://codechina.csdn.net/wwwzhouzy/zhouzy-hmily一、说明hmily是一个高性能异步分布式事务TCC框架,具有以下..

    2022年5月21日
    116
  • Eclipse背景颜色修改

    Eclipse背景颜色修改Eclipse背景颜色修改: 操作界面默认颜色为白色。对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些。设置方法如下: 1、打开window->Preference,弹出Preference面板 2、展开General标签,选中Editors选项,展开。 3、选中TestEditors,右边出现Test

    2022年6月20日
    26
  • Centos7下Rinetd安装与应用[通俗易懂]

    转自http://www.cnblogs.com/zhenyuyaodidiao/p/5540209.htmlLinux下做地址NAT有很多种方法。比如haproxy、nginx的4层代理,linux自带的iptables等都能实现。haproxy、nginx就不说了,配置相对简单;iptables配置复杂,概念也比较多DNAT、SNAT、PREROUTING、POSTROUTING等等。其实

    2022年4月17日
    83
  • SMTP协议介绍_介绍给别人怎么写合同

    SMTP协议介绍_介绍给别人怎么写合同1、SMTP介绍基本概念SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则

    2025年8月22日
    3
  • 加密原理详解:对称式加密 VS 非对称式加密[通俗易懂]

    加密原理详解:对称式加密 VS 非对称式加密[通俗易懂]一、前言在了解加密原理前,我们来看看这样一个故事。小红和小明是情侣,一天,小红给小明发短信说:“亲爱的,我银行卡上没有钱了,你给我转1万块吧。”有过上当受骗经历的人都知道这有可能是小偷偷了小红手提包,然后拿手机发的短信。不过我们小明学过加密原理,于是他回复说:“你直接拿我的银行卡刷吧,密码加上我们第一次约会的日期就是663156。”很明显,只有小明和小红知道他们第一次约会是什么时候,假设是2008年4月1号,那么小红就可以根据计算663156-200841=462315得到银行卡密码,就可以消费了。这

    2022年5月6日
    43
  • 极限思想之芝诺悖论[通俗易懂]

    极限思想之芝诺悖论[通俗易懂]芝诺悖论是古希腊哲学家芝诺提出的一组悖论。芝诺是一个很有学问,同时也很好玩的人(淘气)。他如果在中国出生,估计很难大学毕业,只能跟池子(脱口秀演员~)一样,高中教室门外面站三年课,然后去讲脱口秀糊口。阿基里斯,大家都知道。古希腊神话中的战神。无论是力量,速度,耐力,格斗技巧,都是巅峰级别的。一夜睡三女,第二天依然可以血染特洛伊的男人。芝诺就提出:在跑步比赛中,如果跑得最慢的乌龟一开始领先…

    2022年6月18日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号