对象封装-储值卡

封装:封装的主要目的就是隐藏对象细节,将对象当做黑箱操作。
在Java中取值方法的名称形式是固定的,也就是以get开头,之后接上首字母大写的单词。

package cc.openhome;
import java.util.Scanner;
    class  CashInf
    {
        String number;
        int balance;
        int bonus;
        CashInf(String a,int b,int c){
            this.number=a;
            this.balance=b;
            this.bonus=c;
    }

        public void store(int money)
        {
            if(money>0)
            { this.balance+=money;
                if(money>=1000)
                    this.bonus++;}
            else
            System.out.println("储值为负,你是来捣乱的吗");

        }
        public void change(int money)
        {
            if(money>0)
            { if(money<=this.balance)
                {
                    this.balance-=money;
                }
                else{
                System.out.println("钱不够了");
                }}
            else{
                System.out.println("Are you kindding me?");
            }
        }
            int exchange(int bonus)
            {
                if(bonus>0)
                {
                    this.bonus-=bonus;
                }
                return this.bonus;
            }

    }

建立一个类,并抒写构造函数,定义方法,以便节省重复代码。
store():储存时候调用的方法;
exchange():扣款时候调用的方法;
inexchange():兑换红利点数时候调用的方法;

public class CashCard {
   public static void main(String[] args) {
      //不需要单独设置对象,可以直接设置一个数组进行赋值
      CashInf[] cash={
          new CashInf("A001",500,0),new CashInf("A002",300,0),new CashInf("A003",1000,1),
          new CashInf("A004",2000,2),new CashInf("A005",3000,3)  };
    //输出用户信息 
    //for(CashInf cas:cash){
     //System.out.printf("(%s,%d,%d)%n",cas.number,cas.bonus,cas.balance);}
   //可能的操作,store,exchange,change
   Scanner scanner=new Scanner(System.in);
   for(CashInf cas:cash)
   {
       System.out.printf("(%s,%d,%d)%n",cas.number,cas.bonus,cas.balance);
       cas.store(scanner.nextInt());
       System.out.printf("明细(%s,%d,%d)%n",cas.number,cas.bonus,cas.balance);
   }
   }
}


结果展示:这里写图片描述
加强封装,所以提供取值方法成员(Get);
更改变量的权限修饰:

private String number;
        private int balance;
        private int bonus;

提供取值方法:

  int getBalance()
        {
                return balance;}
        int getBonus()
        {
                return bonus;}
        String getNumber()
        {
            return number;
        }

更改调用方式,如果还像上个程序使用对象调用变量会发生编译错误无法编译,

 System.out.printf("(%s,%d,%d)%n",cas.getNumber(),cas.getBalance(),cas.getBonus());
       cas.store(scanner.nextInt());
       System.out.printf("明细(%s,%d,%d)%n",cas.getNumber(),cas.getBalance(),cas.getBonus());

完整代码如下:


package cc.openhome;
import java.util.Scanner;
    class  CashInf
    {
        private String number;
        private int balance;
        private int bonus;
        CashInf(String a,int b,int c){
            this.number=a;
            this.balance=b;
            this.bonus=c;}

        int getBalance()
        {
                return balance;}
        int getBonus()
        {
                return bonus;}
        String getNumber()
        {
            return number;
        }
        public void store(int money)
        {
            if(money>0)
            { this.balance+=money;
                if(money>=1000)
                    this.bonus++;}
            else
            System.out.println("储值为负,你是来捣乱的吗");

        }
        public void change(int money)
        {
            if(money>0)
            { if(money<=this.balance)
                {
                    this.balance-=money;
                }
                else{
                System.out.println("钱不够了");
                }}
            else{
                System.out.println("Are you kindding me?");
            }
        }
            int exchange(int bonus)
            {
                if(bonus>0)
                {
                    this.bonus-=bonus;
                }
                return this.bonus;
            }

    }
public class CashCard {
   public static void main(String[] args) {
      //不需要单独设置对象,可以直接设置一个数组进行赋值
      CashInf[] cash={
          new CashInf("A001",500,0),new CashInf("A002",300,0),new CashInf("A003",1000,1),
          new CashInf("A004",2000,2),new CashInf("A005",3000,3)  };
    //输出用户信息 
    //for(CashInf cas:cash){
     //System.out.printf("(%s,%d,%d)%n",cas.number,cas.bonus,cas.balance);}
   //可能的操作,store,exchange,change
   Scanner scanner=new Scanner(System.in);
   for(CashInf cas:cash)
   {
       System.out.printf("(%s,%d,%d)%n",cas.getNumber(),cas.getBalance(),cas.getBonus());
       cas.store(scanner.nextInt());
       System.out.printf("明细(%s,%d,%d)%n",cas.getNumber(),cas.getBalance(),cas.getBonus());
   }
   }
}


<think>我们分析的是Vue 3中的响应式数据定义代码: ```javascript const statistics = ref([ { number: 0, label: '订单数', icon: 'car' }, { number: 0, label: '消费总额', icon: 'order' }, // ... 可能还有其他类似对象 ]) ``` ### 功能分析 1. **响应式数据声明**: - 使用Vue 3的`ref`函数创建响应式引用`statistics`,使数组及其内部数据变化能够触发视图更新[^1]。 - 初始值为一个数组,数组元素为对象,每个对象包含`number`、`label`、`icon`三个属性。 2. **数据结构设计**: ```mermaid graph LR A[statistics响应式数组] --> B[对象1] A --> C[对象2] A --> D[...] B --> E[number: 0] B --> F[label: '订单数'] B --> G[icon: 'car'] C --> H[number: 0] C --> I[label: '消费总额'] C --> J[icon: 'order'] ``` - 每个对象代表一个统计指标,包含: - `number`:数值型数据,通常用于展示动态变化的统计值(如从接口获取的最新数据)。 - `label`:字符串,描述统计项的名称(前端显示用)。 - `icon`:字符串,关联图标标识(用于前端显示对应图标)。 3. **典型应用场景**: - **数据看板/仪表盘**:展示订单数量、消费金额等核心业务指标。 - **动态更新**:后续可通过异步请求更新`number`值: ```javascript fetchData().then(data => { statistics.value[0].number = data.orderCount; statistics.value[1].number = data.totalSpent; }) ``` - **组件渲染**:在模板中遍历渲染统计卡片: ```vue <div v-for="(item, index) in statistics" :key="index"> <Icon :name="item.icon"/> <span>{{ item.label }}: {{ item.number }}</span> </div> ``` ### 技术细节解析 | 特性 | 说明 | |-------------|----------------------------------------------------------------------| | **响应式** | 修改`statistics.value`或深层属性(如`statistics.value[0].number`)均触发视图更新[^1] | | **类型安全**| 若使用TypeScript,可定义接口增强类型提示: | | | ```ts | | | interface StatItem { | | | number: number; | | | label: string; | | | icon: string; | | | } | | | const statistics = ref<StatItem[]>([...]); | | | ``` | | **扩展性** | 数组结构便于动态增减统计项,如根据权限展示不同指标 | ### 潜在问题与优化 1. **深层响应式**:直接修改数组元素属性(如`statistics.value[0].number=100`)能触发更新,但若替换整个对象需使用`Vue.set`或解构赋值确保响应性: ```javascript // 正确做法 statistics.value[0] = { ...statistics.value[0], number: newValue } ``` 2. **图标管理**:`icon`字段建议使用枚举或常量管理,避免拼写错误: ```javascript const ICON_TYPES = { CAR: 'car', ORDER: 'order' } statistics.value[0].icon = ICON_TYPES.CAR ``` 3. **初始值设定**:若数据需异步加载,可保留空数组初始状态,避免渲染异常: ```javascript const statistics = ref<StatItem[]>([]) // 初始空数组 ``` ### 相关技术对比 | 方案 | 适用场景 | 本例选择原因 | |---------------------|---------------------------------|--------------------------| | `ref([])` | 需要重新赋值的数组 | 简洁直观,符合多数场景 | | `reactive({ list: [] })` | 需将数组作为对象属性管理时 | 本例无需额外对象封装 | | `shallowRef([])` | 仅需数组引用变化时更新(性能优化)| 本例需更新内部对象属性 | ### 应用场景扩展 1. **国际化**:`label`字段可替换为国际化键值,结合Vue I18n实现多语言切换。 2. **动画效果**:利用`number`变化触发数字滚动动画(如通过`transition`或第三方库)。 3. **权限控制**:通过计算属性过滤敏感统计项: ```javascript const visibleStats = computed(() => statistics.value.filter(item => checkPermission(item.label)) ) ``` §§相关问题§§ 1. Vue 3中`ref`和`reactive`在处理数组时有何性能差异? 2. 如何实现统计数字的动态递增动画效果? 3. 在TypeScript中如何正确定义嵌套对象的响应式类型? </think>### 代码功能分析 #### 1. 响应式数据定义 (`ref`) - 使用 Vue 3 的 `ref` 创建**响应式引用对象** `statistics`,数据变化时自动触发视图更新[^1] - 初始值为空数组 `[]`,后续可通过 `statistics.value` 动态修改数据 #### 2. 数据结构设计 ```javascript [ { number: 0, // 数值型统计结果(如订单数量/金额) label: '订单数', // 统计项名称(前端显示文本) icon: 'car' // 关联图标标识(用于UI渲染) }, { number: 0, label: '消费总额', icon: 'order' }, // ... 其他同类结构 ] ``` **核心字段说明**: | 字段 | 类型 | 作用 | 示例值 | |--------|----------|-------------------------------|---------------| | `number` | `number` | 动态统计数值(常从API获取) | `0` → `152` | | `label` | `string` | 统计项标题(国际化支持) | `"订单数"` | | `icon` | `string` | 图标资源标识(对应UI组件库) | `"car"` | #### 3. 典型应用场景 ```mermaid graph TD A[页面初始化] --> B[创建响应式统计数组] B --> C[发起API请求获取数据] C --> D[更新statistics.value] D --> E[UI自动渲染统计卡片] ``` 1. **数据看板/仪表盘** - 展示订单量、销售额等核心业务指标 - 通过图标 (`icon`) 快速识别统计项类别 2. **动态数据绑定** ```javascript // 从接口更新数据 fetchStatistics().then(res => { statistics.value = res.data.map(item => ({ number: item.value, label: item.title, icon: item.type // 根据类型映射图标 })) }) ``` 3. **组件化渲染** ```vue <template> <div v-for="stat in statistics" :key="stat.label"> <Icon :name="stat.icon"/> <span>{{ stat.label }}: {{ stat.number }}</span> </div> </template> ``` #### 4. 设计优势分析 - **响应式机制**:数据变化自动更新视图(无需手动DOM操作) - **结构标准化**:统一数据结构便于扩展新统计项 - **图标解耦**:`icon` 字段分离业务逻辑与UI实现 - **零值初始化**:避免未加载数据时的渲染错误 ### 潜在改进方向 1. **添加状态管理** ```javascript { number: 0, label: '消费总额', icon: 'order', trend: 'up' // 新增趋势标识 ↑/↓ } ``` 2. **类型安全增强(TypeScript)** ```typescript interface StatItem { number: number label: string icon: IconType // 枚举类型约束 } const statistics = ref<StatItem[]>([]) ``` 3. **异步加载状态** ```javascript const loading = ref(true) fetchData().finally(() => loading.value = false) ``` ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值