Strategy(策略)模式是一种定义算法家族的方法。

题目

Strategy(策略)模式是一种定义算法家族的方法。

如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

以下关于状态(State)模式和策略(Strategy)模式的叙述中,说法错误的是(48)。

A.对于客户程序而言,State模式比Strategy模式更透明

B.Strategy模式用来处理算法变化,State模式用来处理状态变化

C.State模式的对象变化频率比Strategy模式的对象高

D.State模式的“状态”是在对象外部,Strategy模式的“策略”是在对象内部


正确答案:D
解析:State(状态)模式的设计意图是:允许一个对象在其,内部状态改变时变更它的行为。而Strategy(策略)模式的设计意图是:定义一系列的算法,把它们一个一个地封装起来,并且使它们可相互替换。可见,Strategy模式用来处理算法变化,而State模式则是处理状态变化。strategy模式在概念结构上与state模式非常相似,但它们各自的目的不同。区分这两个模式的关键是看行为是由状态驱动还是由一组算法驱动。通常,State模式的“状态”是在对象内部的,Strategy模式的“策略”可以在对象外部。Strategy模式中,算法是否变化完全是由客户程序开始决定的,而且往往一次只能选择一种算法,不存在算法中途发生变化的情况。而State模式如其定义中所言,在它的生命周期中随时存在着状态的转变和行为的更改,而且状态变化是一个线形的整体。对于客户程序而言,这种状态变化往往是透明的。

第2题:

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

A.策略(Strategy)

B.抽象工厂(Abstract Factory)

C.观察者(Visitor)

D.状态(State)


正确答案:A
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

第3题:

阅读下列函数说明和C++代码,回答问题

[说明]

任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。

以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式中,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是C++语言实现,能够正确编译通过。

[C++代码]

class Hand{

private:

int handvalue;

static Hand *hand0;

static Hand *hand1;

static Hand *hand2;

(1) ;

Hand(int handvalue){

this->handvalue = handvalue;

}

public:

(2) Hand* getHand(int handvalue){

/*省略具体实现*/

}

};

Hand *Hand::hand0 = new Hand(0);

Hand *Hand::hand1 = new Hand(1);

Hand *Hand::hand2 = new Hand(2);

class Strategy{

public:

(3) Hand* nextHand() = 0;

};

class WinningStrategy : public Strategy{

private:

bool won;

Hand *prevHand;

public:

winningStrategy(){

won = false;

}

Hand* nextHand(){

if(!won){

prevHand = Hand::getHand(rand()%3);

}

return prevHand;

}

};

class probstrategy : public Strategy{

public:

Hand* nextHand(){

int handvalue = 0;

/*省略具体实现*/

return Hand::getHand(handvalue);

}

};

class Player{

private:

string name;

Strategy* strategy;

public:

Player(string name, (4) strategy){

this->name = name;

this->strategy = strategy;

}

Hand *nextHand()(//向战略请示手势

return (5) ;

}

};


正确答案:(1)private static virtual Strategy* strategy->nextHand()
(1)private static virtual Strategy* strategy->nextHand() 解析:Hand类要保证只产生3个实例,就要求不能随便生成Hand类,因此其构造方法需要是private型的,故空(1)应填private。
先看空(3),由后面的“=0”易判知nexthand()函数是纯虚函数,故空(3)应填virtual。
再来看空(2),由对getHand()方法的调用方式Hand::getHand(rand()%3)及Hand::getHand(handvalue),可知该方法是类Hand的静态方法,故空(2)应填static。
由语句this->strategy = strategy;可知:this->strategy与strategy是同数据类型,this表示自身指针,而this->strategy是Strategy*类型,故空(4)应填Strategy*,注意是指针。
方法nextHand()是“向战略请示手势”,取得手势是通过其所采用的“策略”实现的,故空(5)应填strategy->nextHand()。注意指针写法。

第4题:

按照四人团的说法,Strategy策略模式的基本思想是什么?


正确答案:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,使算法可独立于使用它的客户而变化。

第5题:

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

A.命令(Command)
B.责任链(ChainofResponsibility)
C.观察者(Observer)
D.策略(Strategy)

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

第6题:

可以认为原型化方法是确定软件需求的策略,是一种【 】需求定义策略。


正确答案:动态
动态 解析:可以认为原型化方法是确定软件需求的策略,是一种动态需求定义策略。

第7题:

下图是(请作答此空)设计模式的类图,该设计模式的目的是( ),图中,ConcreteStrategy和Strategy之间是( )关系,Strategy和Context之间是( )关系。

A.适配器
B.桥接
C.装饰
D.策略

答案:D
解析:
适配器模式:将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。装饰模式:指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。类之间的关系主要有以下几种:(1)继承关系:是指子类自动地具有其父类的全部属性与操作,也称为父类对子类的泛化。在UML建模语言中,采用空心三角形表示,从子类指向父类。(2)关联关系:是指两个或多个类之间的一种静态关系,表现为一个类是另一个类的成员变量。在UML类图中,双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头,带普通箭头的实心线指向被拥有者。(3)聚合关系:是整体与部分之间的关系,是强的关联关系。在UML中,聚合关系用带空心菱形的实心线,菱形指向整体。(4)依赖关系:也是类之间的一种静态关系,表现为一个类是另外一个类的局部变量。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

第8题:

阅读以下说明和Java代码,回答问题

[说明]

任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。

以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。

以下是Java语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。

[Java代码]

//Hand.java文件

public class Hand{

public static final int HANDVALUE_GUU = 0; //石头

public static final int HANDVALUE_CHO = 1; //剪刀

public static final int HANDVALUE_PAA = 2; //布

public static final Hand[] hand = {

new Hand(HANDVALUE_GUU),

new Hand(HANDVALUE_CHO),

new Hand(HANDVALUE_PAA),

};

private int handvalue;

(1) Hand(int handvalue){

this.handvalue = handvalue;

}

public (2) Hand getHand(int handvalue)(//从值取得对象实例

return hand[handvalue];

}

}

//Strategy.java文件

public interface Strategy{

public (3) Hand nextHand();

}

//ProbStrategy.java文件

import java.util.Random;

public class ProbStrategy implements Strategy{

public Hand nextHand(){

int handvalue = 0;

/*省略具体实现*/

return Hand.getHand(handvalue);

}

}

//WinningStrategy.java文件

import java.util.Random;

public class WinningStrategy implements Strategy {

/*省略了不相关属性*/

public Hand nextHand(){

if(!won){

prevHand = Hand.getHand(random.nextInt(3));

}

return prevHand;

}

}

//Player.java文件

public class Player {

private String name;

private Strategy strategy;

public Player(String name, (4) strategy){

this.name = name;

this.strategy = strategy;

}

public Hand nextHand(){//向战略请示手势

return (5) ;

}

}


正确答案:private static abstract Strategy strategy.nextHand()
private static abstract Strategy strategy.nextHand()

第9题:

异常处理机制可理解为哪一种行为模式()

  • A、观察者(Observer)模式
  • B、迭代器(Iterator)模式
  • C、职责链(Chain of Responsibility)模式
  • D、策略(Strategy)模式

正确答案:C

第10题:

Strategy(策略)模式对问题的解决方案是什么?以及如何实现?


正确答案: 解决方案是:将算法的选择和算法的实现相分离。让客户可以基于场景做出选择。
实现:让使用算法的类包含一个抽象类,抽象类中有一个抽象方法指定如何调用算法。每个派生类根据需要实现算法。