图解设计模式-Strategy模式

Strategy(算法)模式可以整体的替换算法的实现部分。

重点说明:

使用委托这种弱关联关系可以很方便的整体替换算法。

角色:

Strategy策略:该角色负责决定实现策略所需要的接口api。

ConcreteStrategy具体策略:该角色负责实现Strategy角色接口api。即负责实现具体的策略。

Context上下文:负责使用Strategy角色,Context角色保存了ConcreteStrategy角色的实例,并使用ConcreteStrategy角色去实现需求。

代码:

public class Hand {

    public static final int GUU = 0;
    public static final int CHO = 1;
    public static final int PAA = 2;

    public static final Hand[] hand = {
            new Hand(GUU),
            new Hand(CHO),
            new Hand(PAA),
    };

    private int handValue;
    private Hand(int handValue) {
        this.handValue = handValue;
    }

    private static final String[] name = {
      "石头","剪刀","布"
    };
    public static Hand getHand(int handValue) {
        return hand[handValue];
    }

    public boolean isStrongerThan(Hand h){
        return fight(h)== 1;
    }

    public boolean isWeakerThan(Hand h) {
        return fight(h)== -1;
    }

    private int fight(Hand h) {
        if(this==h){
            return 0;
        }else if((this.handValue+1)%3==h.handValue) {
            return 1;
        }else{
         return -1;
        }
    }
}
public interface Strategy {
    public abstract Hand nextHand();
    public abstract void study(boolean win);
}
public class ProbStrategy implements Strategy {

    private Random random;
    private int preHandValue = 0;
    private int currentHandValue =0;

    private int[][] histroy = {
            {1,1,1},
            {1,1,1},
            {1,1,1}
    };

    public ProbStrategy(int seed) {
        this.random = new Random(seed);
    }

    private int getSum(int hv) {
        int sum = 0;
        for(int i=0;i<3;i++) {
            sum +=histroy[hv][i];
        }
        return sum;
    }

    @Override
    public Hand nextHand() {
        int bet = random.nextInt(getSum(currentHandValue));
        int handvalue = 0;
        if(bet<histroy[currentHandValue][0]) {
            handvalue=0;
        }else if(bet<histroy[currentHandValue][0] + histroy[currentHandValue][1]) {
            handvalue  =1;
        }else {
            handvalue = 2;
        }
        preHandValue=currentHandValue;
        currentHandValue = handvalue;
        return Hand.getHand(handvalue);
    }

    @Override
    public void study(boolean win) {
        if(win){
            histroy[preHandValue][currentHandValue]++;
        }else {
            histroy[preHandValue][(currentHandValue+1)%3]++;
            histroy[preHandValue][(currentHandValue+2)%3]++;
        }
    }
}
public class WinningStrategy implements Strategy {

    private Random random;
    private  boolean won =false;
    private Hand preHand;

    public WinningStrategy(int seed) {
        this.random = new Random(seed);
    }
    @Override
    public Hand nextHand() {
        if(!won) {
            preHand = Hand.getHand(random.nextInt(3));
        }
        return preHand;
    }

    @Override
    public void study(boolean win) {
        won = win;
    }
}
public class Main {
    public static void main(String[] args){

        int seed0=1;
        int seed1=2;

        Play play1 = new Play("王五",new WinningStrategy(seed0));
        Play play2 = new Play("王五",new ProbStrategy(seed1));

        for(int i=0;i<1000;i++) {
            Hand hand1 = play1.nextHand();
            Hand hand2 = play2.nextHand();
            if(hand1.isStrongerThan(hand2)) {
                System.out.println("winner is "+play1);
                play1.win();
                play2.lose();
            }else if(hand2.isStrongerThan(hand1)) {
                System.out.println("winner is "+play2);
                play2.win();
                play1.lose();
            }else {
                System.out.println("even... ");
                play2.even();
                play1.even();
            }
        }
    }
}

执行结果:

winner is [王五:0 ganmes,0 win, 0 lose ]
even...
even...
winner is [王五:3 ganmes,1 win, 0 lose ]
even...
even...
even...
winner is [王五:7 ganmes,2 win, 0 lose ]
winner is [王五:8 ganmes,3 win, 0 lose ]
winner is [王五:9 ganmes,0 win, 4 lose ]
winner is [王五:10 ganmes,4 win, 1 lose ]
winner is [王五:11 ganmes,1 win, 5 lose ]
winner is [王五:12 ganmes,5 win, 2 lose ]
winner is [王五:13 ganmes,2 win, 6 lose ]
even...

原文地址:https://www.cnblogs.com/use-D/p/9601980.html

时间: 2024-11-08 23:46:18

图解设计模式-Strategy模式的相关文章

C++设计模式---Strategy模式

一.前言 学习的第一个设计模式!不知道理解的对不对,期望大家一起多交流~ Strategy模式:策略模式,定义了算法族,分别封装起来,此模式可以让算法的变化独立于使用算法的客户.Strategy模式将逻辑算法封装到一个类中,通过组合的方式将具体的算法实现在组合对象中,再通过委托的方式将抽象的接口的实现委托给组合对象实现.其模型结构图如下: 二.Strategy策略实例 最近在写遥感影像融合相关算法,PCA.Brovey和SFIM算法,正好可以用于这次学习Strategy策略. 关于这三个融合算法

设计模式-strategy模式

策略模式 <设计模式>一书中对策略模式的意图是这样叙述的: 定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换,Strategy模式使算法可以独立于使用他的客户而变化. 仔细分析 在不同的环境下,每个类处理事情使用的算法是不一样的,所以针对不同环境,我们可以灵活使用这些算法.这样可以使得算法独立于客户,可以根据所处上下文,使用不同的业务规则或算法.

图解设计模式-Iterator模式

使用抽象类和接口,弱化类之间的耦合,使类可以更容易组件化 不使用具体类编程,要优先使用抽象类和接口编程 角色划分: Iterator迭代器接口,定义遍历元素的接口,hasNext判断是否有下一个.next获得下一个值 ConcreteIterator:迭代器具体的实现类,实现了hasNext.next两个方法,需要根据具体的被迭代对象进行自定. Aggregate集合接口,包含了获得Iterator迭代器的方法 ConcreteAggregate集合的具体实现类,实现了了获得Iterator迭代

设计模式之策略(Strategy)模式

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法.从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已. 动机 在开发中,我们常常会遇到概念上相同,处理方法不同的任务,例如,对一件商品使用不同的税额计算方法来计算其价格.一般来说,有以下的方法来处理: 复制和粘贴(一份代码具有两个版本,维护成本大) 使用switch或者if语句,用一个变量指定各种情况(分支会变得越来越长) 函数指针或者委托(无法维持对象的状态) 继承(需求变化时,

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,

【原】设计模式-策略模式(Strategy Model)

1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有时需要把年龄做为比较的标准,或者有时又想将身高作为比较的标准,不同的比较标准也就衍生出了统一个比较目的的不同算法实现,在搜索问题中也是类似,有可能用到二分查找.顺序查找之类.通常较简单直接的思维便是将所有的算法(策略)写成一个类的方法,再通过客户端去调用:也可一将所有的算法全部封装在一个方法中用一堆的if...el

C++设计模式实现--策略(Strategy)模式

一. 举例说明 以前做了一个程序,程序的功能是评价几种加密算法时间,程序的使用操作不怎么变,变的是选用各种算法. 结构如下: Algorithm:抽象类,提供算法的公共接口. RSA_Algorithm:具体的RSA算法. DES_Algorithm:具体的DES算法. BASE64_Algorithm:具体的Base64算法. 在使用过程中,我只需要对外公布Algorithm_Context这个类及接口即可. 代码实现: [cpp] view plaincopy //策略类 class Alg

设计模式(1)---Strategy模式

Strategy模式(行为模式) 1.概述 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也是一个性能负担. 2.问题 如何让算法和对象分开来,降低他们之间的耦合度,使得算法可以独立于使用它的客户而变化? 3.解决方案 策略模式:它定义了一系列算法,把每一个算法封装起来,让它们之间可以相互替换,本模式使得算法可独立于使用它的客户而变化. 4.结构 5.例子 商场收银软件:营业员根据顾客所购买商品的单价和