ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(14)访问者模式

2021-12-01 10:32:18  阅读:138  来源: 互联网

标签:14 void 模式 学生 买车 byd Byd 访问者


概念

一个卖车的店铺,车的价格是根据人群决定折扣的,比如学生买车就5折,工人买车就9折。
如果是平时的做法,就会判断是什么人来买车,再决定打多少折扣,这样的设计并不理想,因为有可能下次是自己的亲戚买车,或者其他什么人买车等等,会导致车的这个类频繁修改。

为了解决车这个类频繁修改的问题,可以使用访问者模式。

  • 每个访问者都有车的这个类,比如学生买车,那么学生就是访问者,学生类中存有车的类,学生买车时只要获取到这辆车并拿到车的价格,然后在学生类中根据车的价格处理折扣信息。
  • 当访问者是工人时,就有工人类,在工人类中获取车的价格,并在工人类中处理折扣信息。

实现方式

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 访问者
 */
public class Demo {
    public static void main(String[] args) {
        // 不同的访问者
        Student student = new Student();
        Worker worker = new Worker();

        // 不同的访问者访问汽车
        Car byd = new Byd("比亚迪", 100000);
        byd.accept(student);
        byd.accept(worker);
    }
}

// 访问者,不同的访问者都要实现该接口
interface Visitor {
    // 折扣。不同的访问者有不同的折扣
    void discount(Byd byd);
}

// 学生
class Student implements Visitor {
    public void discount(Byd byd) {
        System.out.println(String.format(
                "学生买汽车。车名:%s,原价:%s,学生价:%s"
                , byd.getName()
                , byd.getPrice()
                , byd.getPrice() * 0.5));
    }
}

// 工人
class Worker implements Visitor {
    public void discount(Byd byd) {
        System.out.println(String.format(
                "工人买汽车。车名:%s,原价:%s,工人价:%s"
                , byd.getName()
                , byd.getPrice()
                , byd.getPrice() * 0.9));
    }
}

// 汽车,所有汽车都要实现该接口
interface Car {
    void accept(Visitor v);
}

// 比亚迪汽车
@Data
@AllArgsConstructor
class Byd implements Car {
    private String name;
    private Integer price;

    // 添加访问者
    public void accept(Visitor v) {
        v.discount(this);
    }
}

学生买汽车。车名:比亚迪,原价:100000,学生价:50000.0
工人买汽车。车名:比亚迪,原价:100000,工人价:90000.0

标签:14,void,模式,学生,买车,byd,Byd,访问者
来源: https://www.cnblogs.com/luchaoguan/p/15627748.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有