设计模式-访问者模式

设计模式-访问者模式

表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

class diagram
我们来举个例子

先定义抽象 Element 电子设备

public interface Electronics {
    void accept(Person person);
}

两个实现电视和手机

public class Television implements Electronics{
    @Override
    public void accept(Person person) {
        System.out.print("电视在工作,");
        person.watchTelevision(this);
    }
}

public class Mobile implements Electronics{
    @Override
    public void accept(Person person) {
        System.out.print("手机在工作,");
        person.playMobile(this);
    }
}

抽象的 Visitor 人

public interface Person {
    void playMobile(Mobile mobile);
    void watchTelevision(Television television);
}

分别实现爸爸,妈妈和儿子三个Visitor

public class Father implements Person {
    @Override
    public void playMobile(Mobile mobile) {
        System.out.print("爸爸在读新闻\n");
    }

    @Override
    public void watchTelevision(Television television) {
        System.out.print("爸爸在看新闻\n");
    }
}

public class Mother implements Person {
    @Override
    public void playMobile(Mobile mobile) {
        System.out.print("妈妈在看八卦\n");
    }

    @Override
    public void watchTelevision(Television television) {
        System.out.print("妈妈在看电视剧\n");
    }
}

public class Son implements Person {
    @Override
    public void playMobile(Mobile mobile) {
        System.out.print("儿子在聊天\n");
    }

    @Override
    public void watchTelevision(Television television) {
        System.out.print("儿子在看演唱会\n");
    }
}

定义对象结构

public class Home {
    private List<Electronics> list = new ArrayList<>();

    public void add(Electronics electronics){
        list.add(electronics);
    }

    public void action(Person person){
        for (Electronics electronics : list){
            electronics.accept(person);
        }
    }
}

调用

public class Demo {
    public static void main(String[] args) {
        Home home = new Home();
        home.add(new Mobile());
        home.add(new Television());

        home.action(new Father());
        home.action(new Mother());
        home.action(new Son());
    }
}

结果
result
访问者模式使 Visitor 的增减不影响其他类代码,同时使 Element 的增减复杂了,需要修改所有代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值