美文网首页
c++设计模式(一)--GeekBand

c++设计模式(一)--GeekBand

作者: 数据小冰 | 来源:发表于2016-07-12 08:34 被阅读15次

一 策略模式
策略模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦。策略模式将逻辑(算法)封装到一个类(Context)里 面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。二 策略模式实现
class TaxStrategy{
public:
virtual double Calculate(const Context& context)=0;
virtual ~TaxStrategy(){}
};

class CNTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
};

class USTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
};

class DETax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//***********
}
};

//扩展
//*********************************
class FRTax : public TaxStrategy{
public:
virtual double Calculate(const Context& context){
//.........
}
};

class SalesOrder{
private:
TaxStrategy* strategy;

public:
SalesOrder(StrategyFactory* strategyFactory){
this->strategy = strategyFactory->NewStrategy();
}
~SalesOrder(){
delete this->strategy;
}

public double CalculateTax(){
    //...
    Context context();
    
    double val = 
        strategy->Calculate(context); //多态调用
    //...
}

};

三 测试模式分析
可以看到策略模式和 Template 模式解决了类似的问题,也正如在 Template 模式中分析的,策略模式和 Template 模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体 子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。这两种方式各有优缺点,先列出来:继承:优点:易于修改和扩展那些被复用的实现。
缺点:①破坏了封装性,继承中父类的实现细节暴露给子类了;②"白盒"复用,原因在 1)中;③当父类的实现更改时,其所有子类将不得不随之改变;④从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。

组合:优点:①"黑盒"复用,因为被包含对象的内部细节对外是不可见的;②封装性好,原因为 1);③实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);④可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类的指针)。
缺点:系统中对象过多。

从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(FavorComposition Over Inheritance)。实际上,继承是一种强制性很强的方式,因此也使得基类和具体子类之间的耦合性很强。例如在模板方法模式中在 ConcreteClass1 中定义的原语操作别的类是不能够直接复用(除非你继承自 AbstractClass,具体分析请参看模板方法模式文档)。而组合(委托)的方式则有很小的耦合性,实现(具体实现)和接口(抽象接口)之间的依赖 性很小,例如在本实现中,ConcreteStrategyA 的具体实现操作很容易被别的类复用,例如我们要定义另一个 Context 类 AnotherContext,只要组合一个指向策略的指针就可以很容易地复用 ConcreteStrategyA 的实现了。

相关文章

  • c++设计模式(一)--GeekBand

    一 策略模式策略模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽...

  • C++设计模式(一) GeekBand

    好的软件设计是多用代码复用,但实际设计中却要遇到许多变化,而变化是复用的天敌。为了能够尽量减少变化所带来的设计复杂...

  • GeekBand C++设计模式

    5.对象创建 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持...

  • 【geekband】C++设计模式1

    具体详见我的博客:(作业的码在博客最后)design patterns责任是思考面向对象设计的一个观点从概念层面,...

  • C++设计模式(二) GeekBand

    “对象创建”模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支...

  • C++设计模式(三) GeekBand

    “对象性能”模式 面向对象很好地解决了“抽象”的问题,但是不可避免地要付出一定的代价。对于通常情况来讲,面向对象的...

  • GeekBand C++设计模式(三)

    这里,对设计模式的概念就不细说了,凡是用过或者看过这方面书籍的都应该有所了解。 鄙人认为正是设计模式的出现,使得C...

  • [GeekBand] C++设计模式-2

    Factory Method 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类...

  • [GeekBand] C++设计模式-3

    Singleton Flyweight State Memento Composite Iterator Chai...

  • [GeekBand] C++设计模式-1

    面向对象设计原则 单一职责原则(SRP) 一个类应该只负责一项职责,即只承担某一项功能。一个类应该仅有一个引起它变...

网友评论

      本文标题:c++设计模式(一)--GeekBand

      本文链接:https://www.haomeiwen.com/subject/jcwjjttx.html