其他分享
首页 > 其他分享> > (14)访问者模式

(14)访问者模式

作者:互联网

概念

一个卖车的店铺,车的价格是根据人群决定折扣的,比如学生买车就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