Java设计模式-状态模式(State)

简介: Java设计模式-状态模式(State)

文章目录

一、状态模式

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

二、状态模式示例代码

模拟会员等级打折。金卡会员打5折,银卡会员打7.5折,铜卡会员打8折。

1.接口

会员卡信息

package behavior.StatePattern;

import java.math.BigDecimal;

/**

* 会员卡信息:

* 积分1元钱

* 1000积分金卡

* 800积分银卡

* 500积分铜卡

*/

public class MemberCardInfo {

   /**

    * 会员等级

    */

   private MemberCardLevel memberCardLevel;

   /**

    * 会员积分

    */

   private Integer memberPoints = 0;

   public MemberCardInfo(MemberCardLevel memberCardLevel) {

       this.memberCardLevel = memberCardLevel;

       memberCardLevel.updateMemLevel();

   }

   public MemberCardInfo(MemberCardLevel memberCardLevel, Integer memberPoints) {

       this.memberCardLevel = memberCardLevel;

       this.memberPoints = memberPoints;

       this.memberCardLevel.setMemberCardInfo(this);

   }

   public Integer getMemberPoints() {

       return memberPoints;

   }

   public void setMemberPoints(Integer memberPoints) {

       this.memberPoints = memberPoints;

   }

   public MemberCardLevel getMemberCardLevel() {

       return memberCardLevel;

   }

   public void setMemberCardLevel(MemberCardLevel memberCardLevel) {

       this.memberCardLevel = memberCardLevel;

       this.memberCardLevel.setMemberCardInfo(this);

   }

   /**

    * 结算

    * @param amt

    */

   public void doBalance(BigDecimal amt){

       this.memberCardLevel.doBalance(amt);

   }

}

package behavior.StatePattern;

import java.math.BigDecimal;

/**

* 提供一个会员等级接口

*/

public abstract class MemberCardLevel {

   protected MemberCardInfo memberCardInfo;

   public void setMemberCardInfo(MemberCardInfo memberCardInfo) {

       this.memberCardInfo = memberCardInfo;

   }

   public abstract void updateMemLevel();

   /**

    * 结算

    */

   public abstract void doBalance(BigDecimal amt);

}

2.会员实现

 

/**

* 金卡会员

*/

public class GoldCardMember extends MemberCardLevel {

   @Override

   public void updateMemLevel() {

       System.out.println("你已经是金卡会员啦");

   }

   @Override

   public void doBalance(BigDecimal amt) {

       System.out.print("金卡会员打折前金额:"+amt);

       System.out.println(",金卡会员打5折之后金额:"+amt.multiply(new BigDecimal("0.5")));

   }

}

package behavior.StatePattern;

import java.math.BigDecimal;

/**

* 银卡会员

*/

public class SilverCardMember extends MemberCardLevel{

   @Override

   public void updateMemLevel() {

       System.out.println("恭喜成为银卡会员!");

   }

   @Override

   public void doBalance(BigDecimal amt) {

       if(memberCardInfo.getMemberPoints() + amt.intValue() > 1000 ){

           memberCardInfo.setMemberCardLevel(new GoldCardMember());

       }else{

           memberCardInfo.setMemberPoints(memberCardInfo.getMemberPoints() + amt.intValue());

           System.out.print("银卡会员打折前金额:"+amt);

           System.out.println(",银卡会员打7.5折之后金额:"+amt.multiply(new BigDecimal("0.75")));

       }

   }

}

package behavior.StatePattern;

import java.math.BigDecimal;

/**

* 铜卡会员

*/

public class CopperCardMember extends MemberCardLevel {

   @Override

   public void updateMemLevel() {

       System.out.println("恭喜你成为铜卡会员!");

   }

   @Override

   public void doBalance(BigDecimal amt) {

       if ( memberCardInfo.getMemberPoints() + amt.intValue() > 1000){

           memberCardInfo.setMemberCardLevel(new GoldCardMember());

       }else if ((memberCardInfo.getMemberPoints() + amt.intValue())> 800 &&

               (memberCardInfo.getMemberPoints() + amt.intValue() )< 1000){

           memberCardInfo.setMemberCardLevel(new SilverCardMember());

       }else {

           memberCardInfo.setMemberPoints(memberCardInfo.getMemberPoints() + amt.intValue());

           System.out.print("铜卡会员打折前金额:" + amt);

           System.out.println(",铜卡会员打8折之后金额:" + amt.multiply(new BigDecimal("0.8")));

       }

   }

}

package behavior.StatePattern;

import java.math.BigDecimal;

/**

* 普通卡

*/

public class BasicCard extends MemberCardLevel{

   @Override

   public void updateMemLevel() {

   }

   @Override

   public void doBalance(BigDecimal amt) {

       if ((memberCardInfo.getMemberPoints() + amt.intValue()) > 1000) {

           memberCardInfo.setMemberCardLevel(new GoldCardMember());

       } else if ((memberCardInfo.getMemberPoints() + amt.intValue()) > 800 &&

               (memberCardInfo.getMemberPoints() + amt.intValue()) < 1000) {

           memberCardInfo.setMemberCardLevel(new SilverCardMember());

       }else if((memberCardInfo.getMemberPoints() + amt.intValue()) > 500 && (memberCardInfo.getMemberPoints() + amt.intValue()) < 800){

           memberCardInfo.setMemberCardLevel(new CopperCardMember());

       } else {

           memberCardInfo.setMemberPoints(memberCardInfo.getMemberPoints() + amt.intValue());

           System.out.print("普通卡不能打卡金额:" + amt);

       }

   }

}

总结

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

相关文章
|
20天前
|
设计模式 算法 Java
Java中的设计模式:提升代码质量的秘诀
【8月更文挑战第23天】在Java开发中,设计模式是提高代码可读性、可维护性和扩展性的强有力工具。本文通过浅显易懂的语言和实际案例,探讨几种常见的设计模式及其在Java中的应用,旨在帮助开发者更好地理解并运用这些模式来优化自己的代码结构。
37 2
|
13天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
30 2
|
13天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
26 1
|
13天前
|
设计模式 Java
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
11 1
|
24天前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。
|
18天前
|
设计模式 缓存 算法
探索 Java 设计模式及其重要性
【8月更文挑战第24天】
41 0
|
21天前
|
设计模式 SQL 缓存
Java编程中的设计模式:单例模式的深入理解与应用
【8月更文挑战第22天】 在Java的世界里,设计模式是构建可维护、可扩展和灵活的软件系统的基石。本文将深入浅出地探讨单例模式这一经典设计模式,揭示其背后的哲学思想,并通过实例演示如何在Java项目中有效运用。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇洞悉软件设计深层逻辑的大门。
26 0
|
24天前
|
设计模式
设计模式-单一职责模式
设计模式-单一职责模式
|
24天前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
24天前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)