状态模式在航空公司会员积分系统中可以很好地管理会员的不同等级状态

状态模式在航空公司会员积分系统中可以很好地管理会员的不同等级状态,以及根据会员的积分情况动态地改变会员等级。下面通过一个具体的例子来说明如何使用状态模式实现航空公司会员积分系统。

1. 状态模式的结构

  • 状态接口(State):定义一个接口,以封装与特定状态相关的行为。
  • 具体状态(ConcreteState):实现状态接口,每种状态对应一个具体状态类,实现与状态相关的行为。
  • 上下文(Context):维护一个对具体状态对象的引用,它定义了客户端需要的接口,并将所有状态特定的行为委托给具体状态对象。

2. 航空公司会员积分系统的实现

假设航空公司会员有以下几种等级:

  • 普通会员(BronzeMember):基础会员等级。
  • 银卡会员(SilverMember):有一定积分的会员。
  • 金卡会员(GoldMember):积分较高的会员。
  • 白金卡会员(PlatinumMember):积分最高的会员。
2.1 状态接口
public interface MemberState {
    void earnPoints(int points);
    void redeemPoints(int points);
    void displayBenefits();
}
2.2 具体状态类
  • 普通会员
public class BronzeMember implements MemberState {
    private AirlineMember member;

    public BronzeMember(AirlineMember member) {
        this.member = member;
    }

    @Override
    public void earnPoints(int points) {
        member.addPoints(points);
        if (member.getPoints() >= 1000) {
            member.setState(member.getSilverMember());
        }
    }

    @Override
    public void redeemPoints(int points) {
        member.deductPoints(points);
    }

    @Override
    public void displayBenefits() {
        System.out.println("普通会员:享受基本会员权益");
    }
}
  • 银卡会员
public class SilverMember implements MemberState {
    private AirlineMember member;

    public SilverMember(AirlineMember member) {
        this.member = member;
    }

    @Override
    public void earnPoints(int points) {
        member.addPoints(points);
        if (member.getPoints() >= 5000) {
            member.setState(member.getGoldMember());
        }
    }

    @Override
    public void redeemPoints(int points) {
        member.deductPoints(points);
        if (member.getPoints() < 1000) {
            member.setState(member.getBronzeMember());
        }
    }

    @Override
    public void displayBenefits() {
        System.out.println("银卡会员:享受优先登机、额外行李额度等权益");
    }
}
  • 金卡会员
public class GoldMember implements MemberState {
    private AirlineMember member;

    public GoldMember(AirlineMember member) {
        this.member = member;
    }

    @Override
    public void earnPoints(int points) {
        member.addPoints(points);
        if (member.getPoints() >= 10000) {
            member.setState(member.getPlatinumMember());
        }
    }

    @Override
    public void redeemPoints(int points) {
        member.deductPoints(points);
        if (member.getPoints() < 5000) {
            member.setState(member.getSilverMember());
        }
    }

    @Override
    public void displayBenefits() {
        System.out.println("金卡会员:享受贵宾休息室、优先登机、额外行李额度等权益");
    }
}
  • 白金卡会员
public class PlatinumMember implements MemberState {
    private AirlineMember member;

    public PlatinumMember(AirlineMember member) {
        this.member = member;
    }

    @Override
    public void earnPoints(int points) {
        member.addPoints(points);
    }

    @Override
    public void redeemPoints(int points) {
        member.deductPoints(points);
        if (member.getPoints() < 10000) {
            member.setState(member.getGoldMember());
        }
    }

    @Override
    public void displayBenefits() {
        System.out.println("白金卡会员:享受最高级别会员权益,包括贵宾休息室、优先登机、额外行李额度等");
    }
}
2.3 上下文类
public class AirlineMember {
    private MemberState currentState;
    private int points;

    public AirlineMember() {
        this.points = 0;
        this.currentState = new BronzeMember(this);
    }

    public void setState(MemberState state) {
        this.currentState = state;
    }

    public MemberState getBronzeMember() {
        return new BronzeMember(this);
    }

    public MemberState getSilverMember() {
        return new SilverMember(this);
    }

    public MemberState getGoldMember() {
        return new GoldMember(this);
    }

    public MemberState getPlatinumMember() {
        return new PlatinumMember(this);
    }

    public void earnPoints(int points) {
        currentState.earnPoints(points);
    }

    public void redeemPoints(int points) {
        currentState.redeemPoints(points);
    }

    public void displayBenefits() {
        currentState.displayBenefits();
    }

    public int getPoints() {
        return points;
    }

    public void addPoints(int points) {
        this.points += points;
    }

    public void deductPoints(int points) {
        this.points -= points;
    }
}
2.4 客户端代码
public class Main {
    public static void main(String[] args) {
        AirlineMember member = new AirlineMember();

        member.displayBenefits(); // 输出:普通会员:享受基本会员权益
        member.earnPoints(1500); // 积分达到银卡会员
        member.displayBenefits(); // 输出:银卡会员:享受优先登机、额外行李额度等权益
        member.earnPoints(4000); // 积分达到金卡会员
        member.displayBenefits(); // 输出:金卡会员:享受贵宾休息室、优先登机、额外行李额度等权益
        member.earnPoints(6000); // 积分达到白金卡会员
        member.displayBenefits(); // 输出:白金卡会员:享受最高级别会员权益,包括贵宾休息室、优先登机、额外行李额度等
        member.redeemPoints(12000); // 积分减少,回到金卡会员
        member.displayBenefits(); // 输出:金卡会员:享受贵宾休息室、优先登机、额外行李额度等权益
    }
}

3. 状态模式的优点

  • 封装性好:将与特定状态相关的行为局部化到一个状态类中,避免了状态模式之外的代码对状态的判断逻辑。
  • 易于扩展:新增状态时,只需添加新的具体状态类,无需修改现有代码。
  • 减少条件语句:状态模式将状态相关的逻辑分散到各个状态类中,减少了上下文类中的条件判断语句。

4. 适用场景

状态模式适用于以下场景:

  • 一个对象的行为取决于其状态,并且在运行时状态会改变。
  • 状态转换逻辑复杂,使用条件语句难以管理。
  • 需要将状态相关的行为封装起来,提高代码的可维护性。

通过状态模式,航空公司会员积分系统能够根据会员的不同积分情况动态地改变会员等级,使得代码更加清晰、易于维护和扩展。
下面是一个使用状态模式实现的航空公司会员积分系统 Python 程序。状态模式非常适合实现会员等级系统,因为会员等级的变化会导致积分累积和兑换规则的改变。

from abc import ABC, abstractmethod

class FlyerState(ABC):
    """飞行会员状态的抽象基类"""
    
    @abstractmethod
    def accumulate_points(self, flyer, flight_distance):
        """累积里程积分"""
        pass
    
    @abstractmethod
    def redeem_ticket(self, flyer, points_needed):
        """兑换机票"""
        pass
    
    @abstractmethod
    def upgrade_status(self, flyer):
        """升级会员状态"""
        pass


class SilverState(FlyerState):
    """银卡会员状态"""
    
    def accumulate_points(self, flyer, flight_distance):
        # 银卡会员每飞行1公里累积1.2积分
        points_earned = flight_distance * 1.2
        flyer.total_points += points_earned
        print(f"银卡会员累积积分:{points_earned},总积分:{flyer.total_points}")
        self.upgrade_status(flyer)
    
    def redeem_ticket(self, flyer, points_needed):
        if flyer.total_points >= points_needed:
            flyer.total_points -= points_needed
            print(f"银卡会员兑换机票成功,扣除积分:{points_needed},剩余积分:{flyer.total_points}")
        else:
            print(f"银卡会员积分不足,需要{points_needed}积分,当前只有{flyer.total_points}积分")
    
    def upgrade_status(self, flyer):
        # 银卡会员积分达到10000升级为金卡
        if flyer.total_points >= 10000:
            flyer.set_state(flyer.gold_state)
            print("恭喜!您已升级为金卡会员!")


class GoldState(FlyerState):
    """金卡会员状态"""
    
    def accumulate_points(self, flyer, flight_distance):
        # 金卡会员每飞行1公里累积1.5积分
        points_earned = flight_distance * 1.5
        flyer.total_points += points_earned
        print(f"金卡会员累积积分:{points_earned},总积分:{flyer.total_points}")
        self.upgrade_status(flyer)
    
    def redeem_ticket(self, flyer, points_needed):
        # 金卡会员兑换机票可以享受9折优惠
        discounted_points = points_needed * 0.9
        if flyer.total_points >= discounted_points:
            flyer.total_points -= discounted_points
            print(f"金卡会员兑换机票成功,扣除积分:{discounted_points}(原价{points_needed}),剩余积分:{flyer.total_points}")
        else:
            print(f"金卡会员积分不足,需要{discounted_points}积分(原价{points_needed}),当前只有{flyer.total_points}积分")
    
    def upgrade_status(self, flyer):
        # 金卡会员积分达到25000升级为白金卡
        if flyer.total_points >= 25000:
            flyer.set_state(flyer.platinum_state)
            print("恭喜!您已升级为白金卡会员!")


class PlatinumState(FlyerState):
    """白金卡会员状态"""
    
    def accumulate_points(self, flyer, flight_distance):
        # 白金卡会员每飞行1公里累积2积分,且每次飞行额外赠送500积分
        base_points = flight_distance * 2
        bonus_points = 500
        total_points_earned = base_points + bonus_points
        flyer.total_points += total_points_earned
        print(f"白金卡会员累积积分:{base_points}(基础) + {bonus_points}(额外奖励) = {total_points_earned},总积分:{flyer.total_points}")
    
    def redeem_ticket(self, flyer, points_needed):
        # 白金卡会员兑换机票可以享受8折优惠,且每次兑换额外返还100积分
        discounted_points = points_needed * 0.8
        if flyer.total_points >= discounted_points:
            flyer.total_points -= discounted_points
            flyer.total_points += 100  # 返还100积分
            print(f"白金卡会员兑换机票成功,扣除积分:{discounted_points}(原价{points_needed}),返还积分:100,剩余积分:{flyer.total_points}")
        else:
            print(f"白金卡会员积分不足,需要{discounted_points}积分(原价{points_needed}),当前只有{flyer.total_points}积分")
    
    def upgrade_status(self, flyer):
        # 白金卡是最高等级,无需升级
        pass


class AirlineFlyer:
    """航空公司会员"""
    
    def __init__(self, name):
        self.name = name
        self.total_points = 0  # 总积分
        
        # 创建各种会员状态
        self.silver_state = SilverState()
        self.gold_state = GoldState()
        self.platinum_state = PlatinumState()
        
        # 设置初始状态为银卡会员
        self.state = self.silver_state
    
    def set_state(self, state):
        self.state = state
    
    def fly(self, distance):
        """飞行一定距离,累积积分"""
        print(f"{self.name}飞行了{distance}公里")
        self.state.accumulate_points(self, distance)
    
    def redeem(self, points_needed):
        """兑换机票"""
        print(f"{self.name}尝试兑换需要{points_needed}积分的机票")
        self.state.redeem_ticket(self, points_needed)
    
    def get_status(self):
        """获取当前会员状态信息"""
        status = {
            "name": self.name,
            "total_points": self.total_points,
            "status": self.state.__class__.__name__.replace("State", "")
        }
        return status


# 测试代码
if __name__ == "__main__":
    # 创建一个新会员
    flyer = AirlineFlyer("张三")
    
    print("=== 测试场景1:银卡会员累积积分 ===")
    flyer.fly(5000)  # 累积5000*1.2=6000积分
    flyer.redeem(5000)  # 尝试兑换需要5000积分的机票
    
    print("\n=== 测试场景2:升级为金卡会员 ===")
    flyer.fly(4000)  # 累积4000*1.2=4800积分,总积分10800,升级为金卡
    flyer.redeem(5000)  # 金卡会员9折,需要4500积分
    
    print("\n=== 测试场景3:升级为白金卡会员 ===")
    flyer.fly(10000)  # 累积10000*1.5=15000积分,总积分25800,升级为白金卡
    flyer.redeem(8000)  # 白金卡会员8折,需要6400积分,返还100积分
    
    print("\n=== 测试场景4:白金卡会员特殊优惠 ===")
    flyer.fly(3000)  # 累积3000*2+500=6500积分
    flyer.redeem(10000)  # 白金卡会员8折,需要8000积分,返还100积分

这个实现中,我们定义了三种会员状态:

  1. SilverState:银卡会员状态,基础会员等级
  2. GoldState:金卡会员状态,积分累积和兑换有一定优惠
  3. PlatinumState:白金卡会员状态,最高等级,享受最多优惠

每个状态类都实现了相同的接口方法(累积积分、兑换机票、升级状态),但根据会员等级的不同,这些方法的行为也不同。会员的行为由当前状态决定,当积分达到一定阈值时,会员状态会自动升级,行为也会相应改变。

测试代码展示了会员从银卡逐步升级到金卡和白金卡的过程,以及不同等级会员在积分累积和机票兑换时享受的不同优惠。
在这里插入图片描述

为了在Windows安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows安装ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.csdn.net/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows安装使用ADB简单易懂教程](https://blog.csdn.net/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值