建设银行网站查询html5素材网
web/
2025/9/29 0:39:12/
文章来源:
建设银行网站查询,html5素材网,开发公司公司简介,义乌建网站Go和Java实现访问者模式
我们下面通过一个解压和压缩各种类型的文件的案例来说明访问者模式的使用。
1、访问者模式
在访问者模式中#xff0c;我们使用了一个访问者类#xff0c;它改变了元素类的执行算法。通过这种方式#xff0c;元素的执行算法可以随
着访问者改变而…Go和Java实现访问者模式
我们下面通过一个解压和压缩各种类型的文件的案例来说明访问者模式的使用。
1、访问者模式
在访问者模式中我们使用了一个访问者类它改变了元素类的执行算法。通过这种方式元素的执行算法可以随
着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式元素对象已接受访问者对象这样访问者
对象就可以处理元素对象上的操作。 意图主要将数据结构与数据操作分离。 主要解决稳定的数据结构和易变的操作耦合问题。 何时使用需要对一个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这 些对象的类使用访问者模式将这些封装到类中。 如何解决在被访问的类里面加一个对外提供接待访问者的接口。 关键代码在数据基础类里面有一个方法接受访问者将自身引用传入访问者。 应用实例您在朋友家做客您是访问者朋友接受您的访问您通过朋友的描述然后对朋友的描述做出一 个判断这就是访问者模式。 优点1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。 缺点1、具体元素对访问者公布细节违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒 置原则依赖了具体类没有依赖抽象。 使用场景1、对象结构中对象对应的类很少改变但经常需要在此对象结构上定义新的操作。 2、需要对一 个对象结构中的对象进行很多不同的并且不相关的操作而需要避免让这些操作污染这些对象的类也不希 望在增加新操作时修改这些类。 注意事项访问者可以对功能进行统一可以做报表、UI、拦截器与过滤器。 适用性 一个对象结构包含很多类对象它们有不同的接口而你想对这些对象实施一些依赖于其具体类的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作让你想避免让这些操作污染这些对象的类。 Visitor使得你可以将相关的操作集中起来定义在一个类中当该对象结构被很多应用共享时用Visitor模 式让每个应用仅包含需要用到的操作。 定义对象结构的类很少改变但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者 的接口这可能想要很大的代价。如果对象结构类经常改变那么可能还是在这些类中定义这些操作较好。
2、Go实现访问者模式
package visitor// 访问者FileUseVisitor
type FileUseVisitor interface {// 为每一个类声明一个visit操作visitPdfFile(FileResourceVisitable)visitPPTFile(FileResourceVisitable)visitTextFile(FileResourceVisitable)
}package visitorimport fmt// 访问者Compress
type Compress struct {
}func (compress *Compress) visitPdfFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Compress file: fileResourceVisitable.(*PdfFile).Path)
}func (compress *Compress) visitPPTFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Compress file: fileResourceVisitable.(*PPTFile).Path)
}func (compress *Compress) visitTextFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Compress file: fileResourceVisitable.(*TextFile).Path)
}package visitorimport fmt// 访问者Decompress
type Decompress struct {
}func (decompress *Decompress) visitPdfFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Decompress file: fileResourceVisitable.(*PdfFile).Path)
}func (decompress *Decompress) visitPPTFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Decompress file: fileResourceVisitable.(*PPTFile).Path)
}func (decompress *Decompress) visitTextFile(fileResourceVisitable FileResourceVisitable) {fmt.Println(Decompress file: fileResourceVisitable.(*TextFile).Path)
}package visitor// 接收者FileResourceVisitable
type FileResourceVisitable interface {accept(FileUseVisitor)
}package visitor// 接收者PdfFile
type PdfFile struct {Path string
}func (pdfFile *PdfFile) accept(fileUseVisitor FileUseVisitor) {fileUseVisitor.visitPdfFile(pdfFile)
}package visitor// 接收者PPTFile
type PPTFile struct {Path string
}func (pPTFile *PPTFile) accept(fileUseVisitor FileUseVisitor) {fileUseVisitor.visitPPTFile(pPTFile)
}package visitor// 接收者TextFile
type TextFile struct {Path string
}func (textFile *TextFile) accept(fileUseVisitor FileUseVisitor) {fileUseVisitor.visitTextFile(textFile)
}package visitor// FileStructure
type FileStructure struct {fileResourceVisitableList []FileResourceVisitable
}func (fileStructure *FileStructure) Attach(fileResourceVisitable FileResourceVisitable) {fileStructure.fileResourceVisitableList append(fileStructure.fileResourceVisitableList, fileResourceVisitable)
}func (fileStructure *FileStructure) Detach(fileResourceVisitable FileResourceVisitable) {for i : 0; i len(fileStructure.fileResourceVisitableList); i {if fileStructure.fileResourceVisitableList[i] fileResourceVisitable {fileStructure.fileResourceVisitableList append(fileStructure.fileResourceVisitableList[:i], fileStructure.fileResourceVisitableList[i1:]...)}}
}func (fileStructure *FileStructure) Accept(fileUseVisitor FileUseVisitor) {for _, fileResourceVisitable : range fileStructure.fileResourceVisitableList {fileResourceVisitable.accept(fileUseVisitor)}
}package mainimport . proj/visitorfunc main() {fileStructure : FileStructure{}fileStructure.Attach(PPTFile{Path: test.ppt})fileStructure.Attach(PdfFile{Path: test.pdf})fileStructure.Attach(TextFile{Path: test.txt})fileStructure.Accept(Decompress{})fileStructure.Accept(Compress{})
}# 输出
Decompress file: test.ppt
Decompress file: test.pdf
Decompress file: test.txt
Compress file: test.ppt
Compress file: test.pdf
Compress file: test.txt3、Java实现访问者模式
package com.visitor;// 访问者FileUseVisitor
public interface FileUseVisitor {// 为每一个类声明一个visit操作void visitPdfFile(FileResourceVisitable fileResourceVisitable);void visitPPTFile(FileResourceVisitable fileResourceVisitable);void visitTextFile(FileResourceVisitable fileResourceVisitable);
}package com.visitor;// 访问者Compress
public class Compress implements FileUseVisitor{Overridepublic void visitPdfFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Compress file: fileResourceVisitable.path);}Overridepublic void visitPPTFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Compress file: fileResourceVisitable.path);}Overridepublic void visitTextFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Compress file: fileResourceVisitable.path);}
}package com.visitor;// 访问者Decompress
public class Decompress implements FileUseVisitor{Overridepublic void visitPdfFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Decompress file: fileResourceVisitable.path);}Overridepublic void visitPPTFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Decompress file: fileResourceVisitable.path);}Overridepublic void visitTextFile(FileResourceVisitable fileResourceVisitable) {System.out.println(Decompress file: fileResourceVisitable.path);}
}package com.visitor;// 接收者FileResourceVisitable
public abstract class FileResourceVisitable {protected String path;abstract void accept(FileUseVisitor fileUseVisitor);
}package com.visitor;// 接收者PdfFile
public class PdfFile extends FileResourceVisitable {public PdfFile(String path){this.path path;}Overridepublic void accept(FileUseVisitor fileUseVisitor) {fileUseVisitor.visitPdfFile(this);}
}package com.visitor;// 接收者PPTFile
public class PPTFile extends FileResourceVisitable {public PPTFile(String path){this.path path;}Overridepublic void accept(FileUseVisitor fileUseVisitor) {fileUseVisitor.visitPPTFile(this);}
}
package com.visitor;// 接收者TextFile
public class TextFile extends FileResourceVisitable {public TextFile(String path){this.path path;}Overridepublic void accept(FileUseVisitor fileUseVisitor) {fileUseVisitor.visitTextFile(this);}
}package com.visitor;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;// FileStructure
public class FileStructure {ListFileResourceVisitable fileResourceVisitableList new ArrayList();public void attach(FileResourceVisitable fileResourceVisitable){fileResourceVisitableList.add(fileResourceVisitable);}public void detach(FileResourceVisitable fileResourceVisitable){Objects.requireNonNull(fileResourceVisitable);}public void accept(FileUseVisitor fileUseVisitor){for(FileResourceVisitable fileResourceVisitable:fileResourceVisitableList){fileResourceVisitable.accept(fileUseVisitor);}}
}package com.visitor;public class Test {public static void main(String[] args) {FileStructure fileStructure new FileStructure();fileStructure.attach(new PPTFile(test.pdf));fileStructure.attach(new PdfFile(test.pdf));fileStructure.attach(new TextFile(test.txt));fileStructure.accept(new Compress());fileStructure.accept(new Decompress());}
}# 输出
Compress file: test.pdf
Compress file: test.pdf
Compress file: test.txt
Decompress file: test.pdf
Decompress file: test.pdf
Decompress file: test.txt
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83605.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!