策略者模式

策略模式

官方定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

个人理解:策略模式将各种不同的方式进行封装,都变成一个类,并且这些类都有一些共性,都有共同的目的,只是中间的方法和资源有些不同,这样我们就可以定义一个抽象基类,给一个接口,让子类进行继承,然后通过用户进行动态调用,决定用哪一种方式去实现。

例如就想旅游一样,我想去旅游就要制定不同的策略和路线规划,那么每种策略都可以进行封装成类,当用户开始旅行时来决定使用哪种方式进行。

适用:

  • 多个类只是区别在表现行为的不同,在运行时选择具体要执行的行为
  • 对客户隐藏自己的实现细节,彼此相互独立

优点:

  • 可以提供不同的备用方案,方面用户进行选择,选择灵活性比较大
  • 可以抽离出不同策略的公共部分,供其使用,减少了冗余度
  • 避免使用多重条件(if-else),可以直接选择

缺点:

  • 因为是客户端要用,则客户端必须知道所有的策略,才好决定用哪种,因此只适用于客户端知道所有所有的行为的情况
  • 策略模式是把每个具体的策略实现都单独封装成类,如果备选很多,对象的数目也是很可观的。
#include <iostream>
using namespace std;

class WeaponBehavior
{
public:
    void virtual useWeapon() = 0;
};

class AK47 :public WeaponBehavior
{
public:
    void useWeapon()
    {
        cout << "Use AK47 to shoot!" << endl;
    }
};

class Knife :public WeaponBehavior
{
public:
    void useWeapon()
    {
        cout << "Use Knife to kill!" << endl;
    }
};

class Character
{
public:
    Character()
    {
        weapon = 0;
    }
    void setWeapon(WeaponBehavior *w)
    {
        this->weapon = w;
    }
    void fight(){
        cout << "The king:";
        if (this->weapon == NULL)
        {
            cout << "You don't have a weapon! Please Set Weapon!" << endl;
        }
        else
        {
            weapon->useWeapon();
        }
    }
private:
    WeaponBehavior *weapon;
};


int main()
{
    WeaponBehavior *ak47 = new AK47();
    WeaponBehavior *knife = new Knife();

    Character *kin = new Character();

    kin->fight();
    cout << endl;

    kin->setWeapon(ak47);
    kin->fight();
    cout << endl;

    kin->setWeapon(knife);
    kin->fight();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的策略模式是一种行为设计模式,它允许在运行时选择算法的行为。该模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。下面是一个简单的策略模式实现的示例: 首先,我们需要定义一个接口,它包含了所有实现算法的方法: ```java public interface Strategy { void executeStrategy(); } ``` 然后我们定义具体的算法实现类: ```java public class ConcreteStrategyA implements Strategy { @Override public void executeStrategy() { System.out.println("执行策略A"); } } public class ConcreteStrategyB implements Strategy { @Override public void executeStrategy() { System.out.println("执行策略B"); } } public class ConcreteStrategyC implements Strategy { @Override public void executeStrategy() { System.out.println("执行策略C"); } } ``` 接下来,我们定义一个 Context 类,它包含一个 Strategy 对象,并提供了一个 setStrategy() 方法,用于动态设置算法: ```java public class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void executeStrategy() { strategy.executeStrategy(); } } ``` 最后,我们可以使用 Context 类来执行具体的算法: ```java public class Client { public static void main(String[] args) { Context context = new Context(); context.setStrategy(new ConcreteStrategyA()); context.executeStrategy(); // 输出 "执行策略A" context.setStrategy(new ConcreteStrategyB()); context.executeStrategy(); // 输出 "执行策略B" context.setStrategy(new ConcreteStrategyC()); context.executeStrategy(); // 输出 "执行策略C" } } ``` 在这个示例中,我们定义了三种具体的策略实现类(ConcreteStrategyA、ConcreteStrategyB 和 ConcreteStrategyC),然后通过 Context 对象来执行具体的算法。通过使用这种模式,我们可以轻松地增加或删除算法实现,并且不需要修改 Context 类的代码,从而实现了算法的灵活可配置性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值