设计模式之访问者模式
Posted vincentyw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之访问者模式相关的知识,希望对你有一定的参考价值。
Visitor(访问者模式)
一、访问者模式简介
访问者模式(Visitor),我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。
根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作
核心:
- 1、数据结构与数据操作分离
- 2、在数据基础类里面有一个方法接受访问者,将自身引用传入访问者
- 3、适合结构固定的数据操作
二、访问者模式优缺点比较
优点:
- 1、符合单一职责原则
- 2、优秀的扩展性
- 3、灵活性好
缺点:
- 1、具体元素对访问者公布细节,违反了迪米特原则
- 2、具体元素变更比较困难
- 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
使用场景:
- 1、抽象语法树 AST
- 2、电脑配件价格优惠
注意事项:1、访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器
三、UML类图
四、设计实现
步骤1:创建配件接口
public interface ComputerPart { public void accept(ComputerPartVisitor cpv); }
步骤2:创建实现配件接口的具体类
public class CPU implements ComputerPart{ @Override public void accept(ComputerPartVisitor cpv) { cpv.visitCPU(this); } } public class Keboard implements ComputerPart{ @Override public void accept(ComputerPartVisitor cpv) { cpv.visitKeboard(this); } }
步骤3:创建访问者接口
public interface ComputerPartVisitor { void visitCPU(ComputerPart cp); void visitKeboard(ComputerPart cp); }
步骤4:创建实现访问者接口具体实现类
public class PersonalVisitor implements ComputerPartVisitor{ private double price; @Override public void visitCPU(ComputerPart cp) { price += 1000; } @Override public void visitKeboard(ComputerPart cp) { price += 100; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
步骤5:调用者测试
public class VisitorDemo { public static void main(String[] args) { PersonalVisitor pv = new PersonalVisitor(); ComputerPart cp = new CPU(); ComputerPart ke = new Keboard(); cp.accept(pv); ke.accept(pv); System.out.println(pv.getPrice()); } }
步骤6:运行程序,观察结果
以上是关于设计模式之访问者模式的主要内容,如果未能解决你的问题,请参考以下文章