掌握设计模式--访问者模式
创作时间:
作者:
@小白创作中心
掌握设计模式--访问者模式
引用
CSDN
1.
https://blog.csdn.net/denlnyyr/article/details/146518628
访问者模式是一种行为设计模式,它允许你将操作(方法)封装到另一个类中,使得你可以在不修改现有类的情况下,向其添加新的操作。这种模式的核心思想是将数据结构和对数据的操作分离,通过访问者对象来对数据进行操作,而不是将操作方法直接嵌入数据结构本身。
访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将操作(方法)封装到另一个类中,使得你可以在不修改现有类的情况下,向其添加新的操作。
核心思想是将数据
结构
和对数据的
操作
分离,通过访问者对象来对数据进行操作,而不是将操作方法直接嵌入数据结构本身。
组成部分
- Visitor(访问者):这是一个接口或抽象类,定义了针对各个元素类(通常是数据结构中的元素)的操作方法。
- ConcreteVisitor(具体访问者):实现访问者接口的具体类,定义了具体的操作。
- Element(元素):这是一个接口或抽象类,定义了接受访问者的接口。通常是数据结构的元素。
- ConcreteElement(具体元素):实现元素接口的具体类,定义数据结构的具体元素。
- ObjectStructure(对象结构):维护一个元素集合,通常是一个集合或树形结构,可以接受访问者的访问。
案例代码
假设我们有一个简单的元素结构,表示不同类型的账单项目,我们要为每种账单项目添加不同的计算方式,比如食物和服装账单,分别使用不同的折扣,这个折扣会经常发生变化。可以通过访问者模式来解决这个问题。
案例类图
账单–元素接口
public interface BillItem {
void accept(BillVisitor visitor);
}
账单–具体元素类:食物类和服装类
public class FoodItem implements BillItem {
private double price;
public FoodItem(double price) {
this.price = price;
}
public double getPrice() {
return price;
}
@Override
public void accept(BillVisitor visitor) {
visitor.visit(this);
}
}
// 具体元素:ClothingItem
class ClothingItem implements BillItem {
private double price;
public ClothingItem(double price) {
this.price = price;
}
public double getPrice() {
return price;
}
@Override
public void accept(BillVisitor visitor) {
visitor.visit(this);
}
}
账单–访问者接口
public interface BillVisitor {
void visit(FoodItem foodItem);
void visit(ClothingItem clothingItem);
}
账单–具体访问者
public class DiscountVisitor implements BillVisitor {
@Override
public void visit(FoodItem foodItem) {
// 9折
double discountedPrice = foodItem.getPrice() * 0.9;
System.out.println("食品折扣价格: " + discountedPrice);
}
@Override
public void visit(ClothingItem clothingItem) {
// 8折
double discountedPrice = clothingItem.getPrice() * 0.8;
System.out.println("服装项目的折扣价格: " + discountedPrice);
}
}
测试客户端
public class VisitorPatternExample {
public static void main(String[] args) {
BillItem food = new FoodItem(100.0);
BillItem clothing = new ClothingItem(200.0);
BillVisitor discountVisitor = new DiscountVisitor();
food.accept(discountVisitor);
clothing.accept(discountVisitor);
}
}
测试输出结果
食品折扣价格: 90.0
服装项目的折扣价格: 160.0
解释
- BillVisitor
是访问者接口,它定义了针对不同类型账单项目(如
FoodItem
和
ClothingItem
)的操作方法。 - BillItem
是元素接口,所有账单项目类都实现该接口。 - FoodItem
和
ClothingItem
是具体的元素类,它们实现了
BillItem
接口,并在
accept
方法中调用访问者的相应操作。 - DiscountVisitor
是一个具体的访问者,计算并打印带折扣的价格。
当需要为账单项目添加新的操作时,只需要添加一个新的访问者类,而不必修改现有的
FoodItem
或
ClothingItem
类。这样就实现了操作和数据结构的分离。
优缺点和适用场景
优点
- 扩展性好:可以方便地添加新的操作而不修改现有元素类(数据结构)。
- 将数据结构和操作解耦:操作逻辑集中在访问者类中,数据结构集中在元素类中。
- 符合开闭原则:可以在不修改原有代码的基础上,增加新的功能。
缺点
- 元素类难以修改:如果元素类的结构改变,需要修改所有访问者类,这在某些情况下会变得麻烦。
- 不适合频繁变动的数据结构:访问者模式适用于元素类结构较为稳定的情况,如果元素类需要频繁变化,访问者模式可能导致很多不必要的修改。
适用场景
- 元素类结构稳定,但你需要在不修改这些类的情况下,增加新的操作。
- 需要对一个对象结构中的元素进行不同的操作时,访问者模式可以避免在元素类中写入大量的业务逻辑。
访问者模式是当你有一个固定的元素结构,但需要频繁进行不同的操作时非常有用的设计模式。
总结
访问者模式是一种行为设计模式,其核心在于通过将操作逻辑封装到访问者对象中,使得在不修改对象结构的前提下,能够为一组对象添加新的行为,同时将
数据结构
和
行为操作
解耦,适用于复杂对象结构中操作变化频繁的场景。
热门推荐
1918-1922年:印度民族解放运动的高涨与历史转折
硝酸甘油和速效救心丸,都不救命
夏季腹泻高发?中医教你食疗妙招!
六个月宝宝断夜奶全攻略:时机、方法与注意事项
一岁宝宝断夜奶,颜值身高都受益!
一岁宝宝夜奶真的会毁牙吗?真相揭秘!
工廠有老鼠怎麼辦?6大捕鼠數據告訴你鼠夾防治如何有效斷絕鼠害
鼠类防治全攻略:从环境治理到药物使用
《Nat. Commun.》:使用铁电聚合物复合材料进行电子冷却和能量收集
流感“神药”管用吗?什么情况要就医?关于流感的热点问答来了→
显著降低住院风险!中国首个抗新冠病毒治疗大样本真实世界研究结果发布
天津至新疆全景自驾之旅:沿途风光、路线攻略及旅行心得分享
牛肉排酸的正确方法,多注意几点!
青岛家庭游必打卡:从沙滩到博物馆,一天玩转最美海岸线
打卡青岛最美滨海风景道:崂山旅游路
收纳师一般月薪多少每个月工资到底能拿多少
哪些因素影响档案整理职工的薪资分类
追根溯源之煎饼果子,它的前世今生,你知道多少?
杭州一日游:从运河祈利酒店出发探秘西湖
从南宋到阿里:杭州如何逆袭成电商之都?
冬季行车必备:车载灭火器的正确使用姿势
干粉型车载灭火器:关键时刻的救星
私家车年检:车载灭火器你配对了吗?
“百冠之城”!宁波硬核在哪?最新报告发布
数字化读书:新时代的阅读革命
高德地图发布2024年春运出行预测:避开拥堵路段攻略
凤凰古城:中国最美丽的小城如何做到生态保护?
如何选择合适的别墅门头装修效果图来提升别墅的整体美感?
潮州凤凰村:社区治理新变化带来乡村振兴新气象
从“穷凤凰”到“金凤凰”:杭州萧山凤凰村的致富密码