码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之访问者模式

时间:2020-04-11 00:12:09      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:uml类图   span   程序   main   自身   简介   print   stat   依赖   

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:运行程序,观察结果

技术图片

 

设计模式之访问者模式

标签:uml类图   span   程序   main   自身   简介   print   stat   依赖   

原文地址:https://www.cnblogs.com/vincentYw/p/12677073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!