北京住房与城乡建设厅网站,如何选择wordpress主题,网页设计与制作实训总结3000字,做游戏装备网站可以吗目录 二、访问者模式概念代码类图实例一#xff1a;名牌运动鞋专卖店销售软件实例二#xff1a;计算机部件销售软优缺点适用场合课程作业 二、访问者模式
概念
对于系统中的某些对象#xff0c;它们存储在同一个集合中#xff0c;具有不同的类型对于该集合中的对象#… 目录 二、访问者模式概念代码类图实例一名牌运动鞋专卖店销售软件实例二计算机部件销售软优缺点适用场合课程作业 二、访问者模式
概念
对于系统中的某些对象它们存储在同一个集合中具有不同的类型对于该集合中的对象可以接受一类被称为访问者的对象来访问不同的访问者其访问方式有所不同
目的 封装一些施加于某种数据结构元素之上的操作一旦这些操作需要修改的话接受这个操作的数据结构可以保持不变
模式动机 为不同类型的元素提供多种访问操作方式且可以在不修改原有系统的情况下增加新的操作方式 缺点将所有的税率运算分布到不同的结点类使得系统不容易理解、维护与改变。 如果要增加一个新的功能则要在很多结点类都写入新的代码且要重新编译所有的类。 当税率变化时要修改每个结点上的calculateTax()代码。 因此该设计的可扩展性和可维护性都不好。 解决方案分离“Tax”类及其“calculateTax()”功能。 将所有结点的税额计算方法都从原来的类中分离出来放入另外一个独立的类叫做“TaxCalculation”类设计图如下。 设计思想将原来分布于各结点中的计算税额的方法都放在一个TaxCalculation类中。当要计算某个结点的税额时则调用TaxCalculation中某个相应的方法进行计算。 代码
访问者模式Visitor Pattern是一种行为型设计模式用于在不改变被访问对象的结构的情况下定义对其元素的新操作。访问者模式将数据结构和对数据的操作分离开来使得操作可以独立变化而不影响数据结构。
在访问者模式中有以下几个角色 访问者Visitor定义了对不同元素的访问操作每个具体访问者都实现了对应的访问方法用于处理特定类型的元素。 具体访问者Concrete Visitor实现了访问者定义的访问方法具体处理不同类型元素的操作。 元素Element定义了接受访问者访问的接口可以是抽象类或接口。 具体元素Concrete Element实现了元素定义的接口具体元素可以有不同的类型每个具体元素都可以接受访问者的访问。 对象结构Object Structure包含元素的集合可以是一个容器也可以是一个复杂的数据结构。
下面是一个简单的访问者模式的示例代码以展示其使用方式和实现原理
// 定义元素接口
interface Element {void accept(Visitor visitor);
}// 具体元素A
class ConcreteElementA implements Element {public void accept(Visitor visitor) {visitor.visitConcreteElementA(this);}public String operationA() {return 具体元素A的操作;}
}// 具体元素B
class ConcreteElementB implements Element {public void accept(Visitor visitor) {visitor.visitConcreteElementB(this);}public String operationB() {return 具体元素B的操作;}
}// 定义访问者接口
interface Visitor {void visitConcreteElementA(ConcreteElementA element);void visitConcreteElementB(ConcreteElementB element);
}// 具体访问者
class ConcreteVisitor implements Visitor {public void visitConcreteElementA(ConcreteElementA element) {System.out.println(访问者对 element.operationA() 的操作);}public void visitConcreteElementB(ConcreteElementB element) {System.out.println(访问者对 element.operationB() 的操作);}
}// 对象结构
class ObjectStructure {private ListElement elements new ArrayList();public void addElement(Element element) {elements.add(element);}public void removeElement(Element element) {elements.remove(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 示例代码的使用
public class VisitorPatternExample {public static void main(String[] args) {// 创建对象结构ObjectStructure objectStructure new ObjectStructure();// 添加具体元素A和BobjectStructure.addElement(new ConcreteElementA());objectStructure.addElement(new ConcreteElementB());// 创建具体访问者Visitor visitor new ConcreteVisitor();// 对对象结构中的元素进行访问操作objectStructure.accept(visitor);}
}在上述示例代码中访问者模式的核心在于访问者Visitor和元素Element的交互。具体的访问者定义了访问不同元素的方法而具体元素实现了接受访问者访问的接口。通过对象结构将元素组织起来并调用访问者的访问方法实现对元素的访问操作。
访问者模式的优点包括
将数据结构和操作解耦使得新增访问操作变得容易。可以对元素的操作进行扩展而不需要修改元素的结构。符合开闭原则增加新的访问者只需要新增具体访问者而不需要修改其他代码。
然而访问者模式也有一些限制和注意事项
增加新的元素可能会导致访问者接口的修改从而需要修改所有的具体访问者。对象结构中的元素类型较多时会导致具体访问者的访问方法过多增加了维护的复杂性。访问者模式适用于数据结构相对稳定但经常需要新增操作的场景对于数据结构变化频繁的场景使用访问者模式可能不合适。
总而言之访问者模式提供了一种灵活的方式来对数据结构的元素进行新的操作同时也将访问逻辑与元素的结构解耦使得系统更加灵活、可扩展和易于维护。
类图
访问者模式表示一个作用于某对象结构中的个元素的操作它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式是一种对象行为型模式 首先分为两个部分一是元素类而是访问者类 先抽象再具体 在访问者类里要有访问元素的方法visitXXX(抽象元素父类做参数)之类的 在元素类里要有接受访问的方法比如accept(抽象访问者父类做参数)等 实例一名牌运动鞋专卖店销售软件 在客户程序中将直接创建运动鞋子类与访问者子类的对象然后直接调用运动鞋子类的 accept 方法。根据用户输入的所购买鞋的数量和单价来计算总价和获得相应特点的功能分别由 Visitor 类的两个子类 PriceVisitor 和 ShoeInfoVisitor 来实现。访问者类图如下。 实例二计算机部件销售软 优缺点
优点
使得增加新的访问操作变得很容易。将有关元素对象的访问行为集中到一个访问者对象中而不是分散到一个个的元素类中。可以跨过类的等级结构访问属于不同的等级结构的元素类。让用户能够在不修改现有类层次结构的情况下定义该类层次结构的操作。
缺点
增加新的元素类很困难违背了“开闭原则”的要求。破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态否则无法供访问者访问。
适用场合
对象结构中对象对应的类很少改变但经常需要在此对象结构上定义新的操作
课程作业