zoukankan      html  css  js  c++  java
  • head first 设计模式 策略模式

    HEAD FIRST:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    设计模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于它的客户而变化。

    大话设计模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

    使用这个模式的原因:

    用许多的算法对一类进行计算。那么如果把这些算法强行编码到这个类当中。其实是不可取的.因为很多时候下不同的情况下使用不同的算法。如果要添加新的算法也比较麻烦。如果一次性就包含了所有的算法那就很庞大了。

    设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起.

    这里变化的代码是说.各种可能会变化的Strategy.也就是一些行为或者算法.把会变化的部分取出来并“封装”起来,好让其他部分不受到影响。

    设计原则二:针对接口编程:关键在于多态,执行时可以根据实际情况执行到真正的行为,不会被绑定到固定的行为上。通常来说,变量的声明类型一遍是抽象类或者接口。如此,只要是具体实现次超类型的类所产生的对象,都可以指定给这个声明的变量。也就是说。声明类的时候不需要理会以后执行时候对应的真正的类型对象。

    设计原则三:多用组合 少用继承.

    小理解:

    Context中有一个Strategy的引用.他可以在Strategy的子类来实例化.也可以动态的改变..赋予某一个子类的实例.然后在Context中用一个方法来实现这个引用->Algorithminterface()...差不多就是这个意思...

    如下:Duck类是 Context

    然后FlyBehavior QuackBehavior是Strategy 类

    在Duck类中的两个引用

     FlyBehavior* flys;

     QuackBehavior *quas;

    好吧~~基本明白了吧~~

      1 #include "stdafx.h"
      2 #include<iostream>
      3 using namespace std;
      4 class FlyBehavior
      5 {
      6 public:
      7     virtual void fly()=0;
      8 };
      9 
     10 class QuackBehavior
     11 {
     12 public:
     13     virtual void quack()=0;
     14 };
     15 class guaguaQuack:public QuackBehavior
     16 {
     17     virtual void quack()
     18     {
     19         cout<<"guaguaQuack"<<endl;
     20     }
     21 };
     22 class wangwangQuack:public QuackBehavior
     23 {
     24     virtual void quack()
     25     {
     26         cout<<"wangwangQuack"<<endl;
     27     }
     28 };
     29 class noQuack:public QuackBehavior
     30 {
     31     virtual void quack()
     32     {
     33         cout<<"keepSilent"<<endl;
     34     }
     35 };
     36 class CanFly:public FlyBehavior
     37 {
     38     virtual void fly()
     39     {
     40         cout<<"I can fly"<<endl;
     41     }
     42 };
     43 class CannotFly:public FlyBehavior
     44 {
     45     virtual void fly()
     46     {
     47         cout<<"I cannot fly"<<endl;
     48     }
     49 };
     50 
     51 class Duck
     52 {
     53 public:
     54     FlyBehavior* flys;
     55     QuackBehavior *quas;
     56     virtual void display()=0;
     57     void setFlyBehavier(FlyBehavior *f)
     58     {
     59         flys = f;
     60     }
     61     void setQuackBehavior(QuackBehavior *q)
     62     {
     63         quas = q;
     64     }
     65     void performFly()
     66     {
     67         flys->fly();
     68     }
     69     void performQua()
     70     {
     71         quas->quack();
     72     }
     73     void performSwim()
     74     {
     75         cout<<"i can swim...all the ducks"<<endl;
     76     }
     77 };
     78 
     79 class modelDuck:public Duck
     80 {
     81 public:
     82     modelDuck()
     83     {
     84         flys = new CannotFly;
     85         quas = new noQuack;
     86     }
     87     virtual void display()
     88     {
     89         cout<<"this is a model duck"<<endl;
     90     }
     91 };
     92 
     93 int _tmain(int argc, _TCHAR* argv[])
     94 {
     95     Duck *d = new modelDuck;
     96     d->display();
     97     d->performFly();
     98     d->setFlyBehavier(new CanFly);
     99     d->performFly();
    100     //d->performQua();
    101     //d->performSwim();
    102     return 0;
    103 }
  • 相关阅读:
    使用winsw将jar包注册成windows服务
    windows 下redis在后台运行
    nDPI的安装和使用
    Passive DNS安装使用
    ffmpeg-join
    Subtitle-ass-srt
    spring cloud项目05:中心化配置-P03-高可用
    spring cloud项目04:中心化配置-P02
    spring cloud项目03:高可用注册中心
    spring boot项目07:日志
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3739556.html
Copyright © 2011-2022 走看看