Java访问者模式实现优雅的对象结构处理
目录
介绍实现总结优点缺点应用场景介绍
Java访问者模式(Visitor Pattern)是一种行为型设计模式,它允许将算法与其所操作的对象分离.该模式定义了一个访问者对象,它可以访问不同类型的对象并执行一些操作,同时也能让你在不修改现有代码的情况下,添加新的操作.
再访问者模式中,有两个重要的角色:访问者和元素. 元素是一个对象结构的组成部分.访问者是一个表示要执行的操作的对象.访问者可以通过元素的接受方法来访问元素.
Java访问者模式通常涉及以下5种角色:
(相关资料图)
抽象访问者(Visitor):定义了可以访问每个元素的访问方法.具体访问者(Concrete Visitor):实现了抽象访问者定义的访问方法,包含针对不同元素的具体操作.抽象元素(Element):定义了一个接受访问者对象的方法,使访问者可以访问自己.具体元素(Concrete Element):实现了抽象元素定义的接受访问者方法,使访问者能够访问自己.对象结构(Object Structure):包含元素的集合,可以提供迭代器遍历元素,并且可以接受访问者的访问.实现
动物园中有不同种类的动物,包括狗,猫和鸟.访问者模式可以用于统计不同类型的动物的个数,以及不同类型的动物的属性信息.
抽象元素
public interface Animal { void accept(Visitor visitor); }
具体元素
@Data public class Bird implements Animal{ private String name; private String habitat; public Bird(String name, String habitat) { this.name = name; this.habitat = habitat; } @Override public void accept(Visitor visitor) { visitor.visitor(this); } } @Data public class Cat implements Animal{ private String sound; private int age; public Cat(String sound, int age) { this.sound = sound; this.age = age; } @Override public void accept(Visitor visitor) { visitor.visitor(this); } } @Data public class Dog implements Animal{ private String color; private int size; public Dog(String color, int size) { this.color = color; this.size = size; } @Override public void accept(Visitor visitor) { visitor.visitor(this); } }
抽象访问者
public interface Visitor { void visitor(Dog dog); void visitor(Cat cat); void visitor(Bird bird); }
具体访问者
public class AnimalCountVisitor implements Visitor{ private int dogCount; private int birdCount; private int catCount; @Override public void visitor(Dog dog) { dogCount++; } @Override public void visitor(Cat cat) { catCount++; } @Override public void visitor(Bird bird) { birdCount++; } public void printCount(){ System.out.println("狗的个数:"+dogCount); System.out.println("猫的个数:"+catCount); System.out.println("鸟的个数:"+birdCount); } } public class AnimalFeatureVisitor implements Visitor { private Listfeatures; public AnimalFeatureVisitor() { features = new ArrayList<>(); } @Override public void visitor(Dog dog) { features.add("Dog:color=" + dog.getColor() + ",size=" + dog.getSize()); } @Override public void visitor(Cat cat) { features.add("Car:sound=" + cat.getSound() + ",age=" + cat.getAge()); } @Override public void visitor(Bird bird) { features.add("Bird:name=" + bird.getName() + ",habitat=" + bird.getHabitat()); } public void printFeatures(){ features.forEach(System.out::println); } }
测试
public class Demo { public static void main(String[] args) { Listanimals = new ArrayList<>(); animals.add(new Dog("褐色", 50)); animals.add(new Dog("白色", 45)); animals.add(new Cat("喵喵叫", 2)); animals.add(new Cat("呜呜声", 3)); animals.add(new Bird("鹦鹉", "森林")); animals.add(new Bird("麻雀", "田野")); AnimalCountVisitor animalCountVisitor = new AnimalCountVisitor(); AnimalFeatureVisitor animalFeatureVisitor = new AnimalFeatureVisitor(); animals.forEach(animal -> { animal.accept(animalCountVisitor); animal.accept(animalFeatureVisitor); }); animalCountVisitor.printCount(); animalFeatureVisitor.printFeatures(); } }
再这个例子中,我们定义了三种动物类,包括Dog,Cat和Bird,它们都实现了Animal接口,并且是心啊了accept方法,其中传入了Visitor类型的参数.
接下来,定义了Visitor接口,其中包含了visitor方法,该方法根据传入的不同类型的动物进行访问.
再具体的Visitor的实现中,定义了AnimalCountVisitor和AnimalFeatureVisitor两个访问者,前者用于统计不同类型的动物的个数,后者用于打印不同类型的动物的属性.
总结
优点
分离算法与对象:访问者模式使得算法与对象分离成为可能,因为算法被定义在访问者中,而对象则在被访问时向访问者公开自己的数据.扩展性好:该模式可以方便地添加新的操作而不会影响现有的对象结构,因为访问者模式将对象结构与操作分离开来.符合开闭原则:访问者模式符合开闭原则,因为您可以在不更改现有代码的情况下添加新的访问者和新的元素类型.简化代码逻辑:访问者模式将对象和操作分离开来,简化了代码逻辑.缺点
增加新的元素类型困难:当需要增加新的元素类型时,必须修改现有的访问者接口,这可能导致对现有代码的修改.破坏封装:访问者模式需要将对象的内部数据暴漏给访问者,这可能破坏对象的封装性.应用场景
当需要对一个复杂对象结构进行操作而不想暴漏其内部实现时,可以使用访问者模式.当需要为对象结构中的各个对象增加一些新的操作而不影响其类层次结构时,可以使用访问者模式.当对象的类层次结构发生变化,但其操作仍然保持相对稳定时,可以使用访问者模式.当需要在运行时动态确定要执行的操作时,可以使用访问者模式.到此这篇关于Java访问者模式实现优雅的对象结构处理的文章就介绍到这了,更多相关Java访问者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
上一篇:C++特殊类设计概念与示例讲解
下一篇:最后一页
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?