
package com.learning.visitor;
/**
* 抽象访问者
*/
public interface Person {
public void feed(Dog dog);
public void feed(Cat cat);
}
package com.learning.visitor;
/**
* 自家主人
*/
public class Owner implements Person{
@Override
public void feed(Cat cat) {
System.out.println("主人喂食猫");
}
@Override
public void feed(Dog dog) {
System.out.println("主人喂食狗");
}
}
package com.learning.visitor;
/**
* 其他人
*/
public class Someone implements Person{
@Override
public void feed(Dog dog) {
System.out.println("其他人喂食狗");
}
@Override
public void feed(Cat cat) {
System.out.println("其他人喂食猫");
}
}
package com.learning.visitor;
/**
* 抽象元素 动物
*/
public interface Animal {
void accept(Person person);
}
package com.learning.visitor;
/**
* 狗
*/
public class Dog implements Animal{
@Override
public void accept(Person person) {
person.feed(this);
System.out.println("汪汪汪");
}
}
package com.learning.visitor;
/**
* 猫
*/
public class Cat implements Animal{
@Override
public void accept(Person person) {
person.feed(this);
System.out.println("喵喵喵");
}
}
package com.learning.visitor;
import java.util.ArrayList;
import java.util.List;
/**
* 家
*/
public class Home {
// 声明一个集合对象,用来存储元素对象
private List animalList = new ArrayList<>();
// 添加元素功能
public void add(Animal animal){
animalList.add(animal);
}
public void action(Person person){
//遍历集合,获取每一个元素,让访问者访问每一个元素
for(Animal animal : animalList){
animal.accept(person);
}
}
}
package com.learning.visitor;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
//创建home对象
Home home = new Home();
// 添加元素到home对象中
home.add(new Dog());
home.add(new Cat());
//创建主人对象
Owner owner = new Owner();
// 主人喂猫
home.action(owner);
//创建其他人对象
Someone someone = new Someone();
//其他人喂食
home.action(someone);
}
}


package com.learning.visitor.shop;
// 结账接口
interface Checkout {
// 结账毛巾
void checkout(Towel towel);
// 结账饼干
void checkout(Cookie cookie);
// 结账酸奶
void checkout(Yogurt yogurt);
}
package com.learning.visitor.shop;
// 人工结账类
public class ManualCheckout implements Checkout {
@Override
public void checkout(Towel towel) {
System.out.println("人工结账毛巾");
}
@Override
public void checkout(Cookie cookie) {
System.out.println("人工结账饼干");
}
@Override
public void checkout(Yogurt yogurt) {
System.out.println("人工结账酸奶");
}
}
package com.learning.visitor.shop;
// 自动结账类
public class AutoCheckout implements Checkout {
@Override
public void checkout(Towel towel) {
System.out.println("自动结账毛巾");
}
@Override
public void checkout(Cookie cookie) {
System.out.println("自动结账饼干");
}
@Override
public void checkout(Yogurt yogurt) {
System.out.println("自动结账酸奶");
}
}
package com.learning.visitor.shop;
// 物品接口
public interface Item {
void accept(Checkout checkout);
double getPrice();
String getName();
}
package com.learning.visitor.shop;
/**
* 毛巾类
*/
public class Towel implements Item{
@Override
public void accept(Checkout checkout) {
checkout.checkout(this);
}
@Override
public double getPrice() {
return 5.99;
}
@Override
public String getName() {
return "毛巾";
}
}
package com.learning.visitor.shop;
/**
* 饼干
*/
public class Cookie implements Item {
@Override
public void accept(Checkout checkout) {
checkout.checkout(this);
}
@Override
public double getPrice() {
return 2.99;
}
@Override
public String getName() {
return "饼干";
}
}
package com.learning.visitor.shop;
/**
* 酸奶
*/
public class Yogurt implements Item {
@Override
public void accept(Checkout checkout) {
checkout.checkout(this);
}
@Override
public double getPrice() {
return 1.99;
}
@Override
public String getName() {
return "酸奶";
}
}
package com.learning.visitor.shop;
import java.util.ArrayList;
import java.util.List;
// 购物车类
public class ShoppingCart {
private List- items = new ArrayList<>();
public void addItem(Item item) {
items.add(item);
}
/**
* 结账action
* @param checkout
*/
public void action(Checkout checkout) {
for (Item item : items) {
item.accept(checkout);
}
}
}
package com.learning.visitor.shop;
/**
* 超市销售系统
*/
public class SupermarketSystem {
public static void main(String[] args) {
// 创建物品
Item towel = new Towel();
Item cookie = new Cookie();
Item yogurt = new Yogurt();
// 创建购物车并添加物品
ShoppingCart cart = new ShoppingCart();
cart.addItem(towel);
cart.addItem(cookie);
cart.addItem(yogurt);
// 使用人工结账
ManualCheckout manualCheckout = new ManualCheckout();
cart.action(manualCheckout);
// 使用自动结账
AutoCheckout autoCheckout = new AutoCheckout();
cart.action(autoCheckout);
}
}

// 结账接口
interface Checkout {
void checkout(ShoppingCart cart);
}
// 人工结账类
class ManualCheckout implements Checkout {
@Override
public void checkout(ShoppingCart cart) {
System.out.println("Manual Checkout");
System.out.println("Total price: " + cart.getTotalPrice());
// 在这里执行人工结账的逻辑,比如接收现金或刷卡
}
}
// 自动结账类
class AutoCheckout implements Checkout {
@Override
public void checkout(ShoppingCart cart) {
System.out.println("Auto Checkout");
System.out.println("Total price: " + cart.getTotalPrice());
// 在这里执行自动结账的逻辑,比如扫描条形码或使用移动支付
}
}