一个策略模式的例子(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)
    };
    
    //表示猜拳中手势所对应的字符串
    public static final String[] name = {"石头", "剪刀", "布"};
    
    //猜拳中出的手势的值
    private int handValue;
    
    //构造器
    private Hand(int handValue) {
        this.handValue = handValue;
    }
    
    //根据手势的值获取其对应的实例
    public static Hand getHand(int handValue) {
        return hand[handValue];
    }
    
    //如果this胜了h则返回true
    public boolean isStrongerThan(Hand h) {
        return fight(h) == 1;
    }
    
    //如果this输给h则返回-1
    public boolean isWeakerThan (Hand h) {
        return fight(h) == -1;
    }
    
    //计分:平0、胜1、负-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 String toString() {
        return name[handValue];
    }

}

策略接口

public interface Strategy {
    
    public abstract Hand nextHand();
    
    public abstract void study(boolean win);

}

策略——随机出拳

import java.util.Random;

public class WinningStrategy implements Strategy {
    
    //实例化Random
    private Random random;
    
    //初始化没赢
    private boolean won = false;
    
    //手
    private Hand prevHand;
    
    //根据种子值生成随机数的构造器
    public WinningStrategy(int seed) {
        random = new Random(seed);
    }

    /**
     * 随机换一个手势
     */
    @Override
    public Hand nextHand() {
        // TODO Auto-generated method stub
        if (!won) {
            prevHand = Hand.getHand(random.nextInt(3));
        }
        return prevHand;
    }

    /**
     * 获知赢没赢
     */
    @Override
    public void study(boolean win) {
        // TODO Auto-generated method stub
        won = win;
    }

}

说明

随机化的猜拳肯定不是很优的策略,这是个库存,举个小例子展示一下如何使用策略模式。

发布了538 篇原创文章 · 获赞 1098 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/101601839