23种设计模式学习记录之访问者模式

本文所有案例代码

码云:https://gitee.com/helloworld6379/designPattern
Github:Github地址

设计模式概述

1 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通
用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的
一段时间的试验和错误总结出来的。
2 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。
3 设计模式并不局限于某种语言,java,php,c++ 都有设计模式.

设计模式类型
设计模式分为三种类型,共 23 种
1 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
2 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。

简单介绍

  1. 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
  2. 主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题
  3. 访问者模式的基本工作原理:在被访问的类里面加一个对外提供接待访问者的接口
  4. 访问者模式主要应用场景:需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时避免让这些操作"污染"这些对象的类。

实现

访问者访问电脑的鼠标、键盘和屏幕,
电脑的鼠标、键盘和屏幕彼此没有关联,
添加访问电脑的摄像头并不会影响到鼠标、键盘和屏幕。

UML图:
23种设计模式学习记录之访问者模式_第1张图片

/**
 * @Description 被访问者的接口
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public interface ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor);
}
/**
 * @Description 被访问者的实体类
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class Keyboard implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
/**
 * @Description 被访问者的实体类
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class Monitor implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
/**
 * @Description 被访问者的实体类
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class Mouse implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
/**
 * @Description 被访问者的实体类
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class Computer implements ComputerPart {

    private ComputerPart[] parts;

    public Computer(){
        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
    }

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        for (int i = 0; i < parts.length; i++) {
            parts[i].accept(computerPartVisitor);
        }
        computerPartVisitor.visit(this);
    }
}
/**
 * @Description 访问者的接口
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public interface ComputerPartVisitor {
    public void visit(Computer computer);
    public void visit(Mouse mouse);
    public void visit(Keyboard keyboard);
    public void visit(Monitor monitor);
}
/**
 * @Description 访问者实体类
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

    @Override
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }

    @Override
    public void visit(Mouse mouse) {
        System.out.println("Displaying Mouse.");
    }

    @Override
    public void visit(Keyboard keyboard) {
        System.out.println("Displaying Keyboard.");
    }

    @Override
    public void visit(Monitor monitor) {
        System.out.println("Displaying Monitor.");
    }
}
/**
 * @Description 访问者模式测试
 * @Author: LiuXing
 * @Date: 2020/5/28 21:32
 */
public class VisitorPatternTest {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.accept(new ComputerPartDisplayVisitor());
    }
}

你可能感兴趣的:(面试,设计模式)