>  기사  >  백엔드 개발  >  C++ 디자인 패턴의 전략 패턴에 대한 간략한 소개

C++ 디자인 패턴의 전략 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-18 15:05:571119검색

전략 모드 정의:

은 알고리즘 계열을 정의하고 이를 서로 교체할 수 있도록 별도로 캡슐화합니다. 이 모드를 사용하면 알고리즘 변경이 알고리즘을 사용하는 고객에게 영향을 주지 않습니다.

전략 패턴에는 다음 역할이 포함됩니다.

컨텍스트: 환경 클래스

전략: 추상 전략 클래스

ConcreteStrategy: 구체적인 전략 클래스

UML 클래스 다이어그램:

C++ 디자인 패턴의 전략 패턴에 대한 간략한 소개

테스트 케이스

[code]int main(){
    //商品费用
    double cost;
    //采取某种收费策略之后的费用
    double result;
    //假如
    cost = 1029.88;

    //声明要使用的具体策略类
    //这里显示出了策略类的缺点:客户端必须知道有哪些具体封装的算法。如本例必须知道三种收费方式Normal、Return、Rebate。
    StrategyCashSuper *Normal = new ConerectStrategyNormal(cost);//抽象策略类(基类)指针指向派生类->具体策略类(普通收费方式)
    StrategyCashSuper *Return = new ConerectStrategyReturn(cost); //满300返100收费方式
    StrategyCashSuper *Rebate = new ConerectStrategyRebate(cost); //打八折收费
    //声明环境类,具体调用的算法,由它来维护
    Context *c = new Context();
    //设置使用的策略类
    c->setStrategy(Normal);//设置为普通收费
    //调用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    c->setStrategy(Return);//设置为满300返100收费方式
    //调用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    c->setStrategy(Rebate);//设置为打八折收费
    //调用算法
    result = c->getChargeResult();
    std::cout << "Accrued expenses: " << result << std::endl;

    return 0;
}

헤더 파일 Strategy.h

[code]#ifndef _2STRATEGY_H_
#define _2STRATEGY_H_
//策略类,算法基类
class StrategyCashSuper{
protected:
    //商品应付费用,定义为保护成员供子类继承
    double cost;   
public:
    //构造函数
    StrategyCashSuper(double c):cost(c){}
    //收费结果算法
    virtual double ChargeResult();//本想定义为纯虚函数,但不可以。因为虚基类本不能实例化
};

//正常收费算法
class ConerectStrategyNormal: public StrategyCashSuper{
public:
    //构造函数
    ConerectStrategyNormal(double c):StrategyCashSuper(c){}
    //根据本类的收费方式,重写继承的收费算法
    double ChargeResult()override;
};

//满300返100收费算法
class ConerectStrategyReturn: public StrategyCashSuper{
public:
    //构造函数
    ConerectStrategyReturn(double c):StrategyCashSuper(c){}
    //重写收费算法
    double ChargeResult()override;    
};

//打八折收费算法
class ConerectStrategyRebate: public StrategyCashSuper{
public:
    //构造函数
    ConerectStrategyRebate(double c):StrategyCashSuper(c){}
    //重写收费算法
    double ChargeResult()override;  

};

//环境类,根据具体算法,维护上下文使用的类
class Context{
private:
    //策略基类
    StrategyCashSuper *SCS;
public:
    //设置使用的策略
    void setStrategy(StrategyCashSuper *s);
    //具体执行的算法
    double getChargeResult();
};

#endif

Implement Strategy.cpp

[code]#include "2Strategy.h"
//基类
double StrategyCashSuper::ChargeResult(){
    return 0;
}

//正常收费
double ConerectStrategyNormal::ChargeResult(){
    return cost;
}

//满300返100收费算法
double ConerectStrategyReturn::ChargeResult(){
    double res = cost;
    if(res >= 300)
        res = cost - 100;
    return res;
}
//打八折收费算法
double ConerectStrategyRebate::ChargeResult(){
    return cost *0.8;
}

//设置使用的算法
void Context::setStrategy(StrategyCashSuper *s){
    SCS = s;
}

//具体执行的算法
double Context::getChargeResult(){
    return SCS->ChargeResult();
}

요약:

전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있으며 정책 패턴도 됩니다. 전략 패턴은 객체 행동 패턴입니다.

전략 패턴에는 3가지 역할이 포함됩니다. 추상 전략 클래스는 지원되는 알고리즘에 대한 추상 메서드를 선언하고 모든 전략 클래스의 상위 클래스이며, 구체적인 전략 클래스는 추상 전략 클래스에 정의된 알고리즘을 구현합니다. 환경 클래스는 특정 문제를 해결하기 위해 여러 전략 클래스를 사용할 수 있으며(단점은 클라이언트가 캡슐화된 전략 클래스를 모두 알아야 한다는 것입니다) 환경 클래스의 추상 전략 클래스에 대한 참조 인스턴스를 유지 관리합니다.

전략 패턴은 알고리즘을 캡슐화한 것입니다. 이는 알고리즘 자체에서 알고리즘의 책임을 분리하고 이를 다른 객체 관리에 위임합니다. 전략 패턴은 일반적으로 일련의 알고리즘을 추상 전략 클래스의 하위 클래스로 일련의 전략 클래스로 캡슐화합니다.

전략 모드의 가장 큰 장점은 "열림 및 닫힘 원리"를 완벽하게 지원한다는 것입니다. 원래 시스템을 수정하지 않고도 알고리즘을 교체하거나 새 알고리즘을 추가할 수 있습니다. 코드 개선 재사용성은 상속을 대체하고 여러 조건부 전송 문을 피하는 방법입니다. 단점은 클라이언트가 모든 전략 클래스를 알고 그 차이점을 이해해야 하며 동시에 시스템의 클래스 수가 증가한다는 것입니다. 어느 정도는 전략 클래스가 많이 있을 수 있습니다.

전략 패턴의 적용 가능한 상황은 다음과 같습니다. 시스템에는 많은 클래스가 있으며 이들 사이의 차이점은 동작뿐입니다. 전략 패턴을 사용하면 객체가 여러 동작 중에서 하나의 동작을 동적으로 선택할 수 있습니다. 시스템은 여러 알고리즘 중 하나를 동적으로 선택해야 하며, 유지 관리가 어려운 여러 조건 선택 문을 사용하지 말고 특정 전략 클래스에 알고리즘 및 관련 데이터 구조를 캡슐화해야 합니다.

위 내용은 C++ 디자인 패턴과 전략 패턴에 대한 간략한 소개 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.