23种设计模式-访问者模式(Android应用场景介绍)
创始人
2025-05-28 02:05:35
0

什么是访问者模式?

访问者模式是一种行为型设计模式,其目的是在不改变现有类结构的前提下,增加新的操作或算法。

在这种模式中,我们通过定义访问者类(Visitor)和被访问的元素类(Element)来实现操作的分离。被访问的元素类提供接受访问者访问的方法,而访问者类则定义了对元素的不同操作。在执行操作时,访问者会将自己传入元素类的接受访问者方法中,从而实现对元素的访问和操作。

访问者模式Java示例

下面我们使用Java语言来实现访问者模式。我们将实现一个动物园的例子,其中包含了不同类型的动物,如狮子、老虎和猴子等,我们将实现对它们的不同操作,如观察、喂食和清理等。

首先,我们需要定义动物类的接口(Element):

public interface Animal {void accept(Visitor visitor);
}

在这个接口中,我们定义了一个接受访问者访问的方法 accept()。

接下来,我们定义了访问者类(Visitor):

public interface Visitor {void visit(Lion lion);void visit(Tiger tiger);void visit(Monkey monkey);
}

在这个接口中,我们定义了不同类型的动物的访问方法,如 visit(Lion lion)、visit(Tiger tiger) 和 visit(Monkey monkey)。

现在,我们需要实现不同类型的动物类,并在它们的 accept() 方法中调用访问者的 visit() 方法:

public class Lion implements Animal {public void roar() {System.out.println("Lion is roaring");}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}public class Tiger implements Animal {public void growl() {System.out.println("Tiger is growling");}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}public class Monkey implements Animal {public void jump() {System.out.println("Monkey is jumping");}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}
}

最后,我们需要实现具体的访问者类,以实现对不同类型的动物的不同操作:

public class Zookeeper implements Visitor {@Overridepublic void visit(Lion lion) {System.out.println("Zookeeper is watching Lion");lion.roar();}@Overridepublic void visit(Tiger tiger) {System.out.println("Zookeeper is feeding Tiger");tiger.growl();}@Overridepublic void visit(Monkey monkey) {System.out.println("Zookeeper is cleaning Monkey's cage");monkey.jump();}
}

在这个访问者类中,我们实现了对狮子、老虎和猴子的不同操作。

现在,我们可以创建动物对象,并将它们传入Zookeeper 访问者对象的 accept() 方法中,从而实现对动物的访问和操作:

public class Main {public static void main(String[] args) {List animals = new ArrayList<>();animals.add(new Lion());animals.add(new Tiger());animals.add(new Monkey());Visitor zookeeper = new Zookeeper();for (Animal animal : animals) {animal.accept(zookeeper);}}
}

在这个示例中,我们创建了一个包含不同类型动物的列表,然后创建了一个 Zookeeper 访问者对象,对每一个动物对象调用其 accept() 方法,并将 Zookeeper 访问者对象传入,从而实现对动物的访问和操作。

Android应用场景介绍

在 Android 开发中,访问者模式也被广泛应用。例如,在 RecyclerView 控件中,Adapter(适配器)对象是一个访问者对象,而 RecyclerView.ViewHolder 对象是一个被访问者对象。

在 RecyclerView.Adapter 中,我们需要实现 onCreateViewHolder()、onBindViewHolder() 和 getItemCount() 等方法。这些方法被用于创建 ViewHolder 对象、绑定数据和获取列表项的数量等操作。

在 RecyclerView.ViewHolder 中,我们需要定义列表项的视图控件,并在构造函数中将其初始化。当 Adapter 对象需要绑定数据时,ViewHolder 对象会被创建并传递给 Adapter 对象的 onBindViewHolder() 方法中,从而实现对列表项的访问和操作。

下面是一个简单的示例代码:

public class MyAdapter extends RecyclerView.Adapter {private List mData;public MyAdapter(List data) {mData = data;}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {String data = mData.get(position);holder.mTextView.setText(data);}@Overridepublic int getItemCount() {return mData.size();}
}public class MyViewHolder extends RecyclerView.ViewHolder {public TextView mTextView;public MyViewHolder(View itemView) {super(itemView);mTextView = itemView.findViewById(R.id.text_view);}
}

在这个示例中,MyAdapter 是一个访问者对象,而 MyViewHolder 是一个被访问者对象。MyAdapter 中的 onCreateViewHolder()、onBindViewHolder() 和 getItemCount() 方法对 MyViewHolder 对象进行了访问和操作,从而实现了对 RecyclerView 列表项的访问和操作。

总结

访问者模式可以帮助我们在不改变现有类结构的前提下,增加新的操作或算法。在 Android 开发中,访问者模式也被广泛应用。理解访问者模式可以帮助我们更好地理解和应用 Android 中的许多常用设计模式。

相关内容

热门资讯

“国补”继续!10月将下达第四... 8月1日国家发展改革委召开新闻发布会,解读当前经济形势和经济工作。国家发展改革委政策研究室有关负责人...
港股IPO,重大调整! 8月1日,港交所就优化首次公开招股市场定价及公开市场规定的咨询文件刊发咨询总结,并就持续优化公众持股...
两江新区:148家智慧医疗装备... 近日,江小妹获悉, 2025年上半年, 作为重庆高新产业的“主阵地”, 两江新区生命健康产业增长势头...
造纸江湖浮沉:废纸回收价5年内... 本报(chinatimes.net.cn)记者何一华 李未来 北京报道 “最近收废纸的价格涨了,以前...
国邦医药已累计回购538万股公... 8月1日晚间,国邦医药发布公告称,截至7月31日,公司通过集中竞价交易方式累计回购股份537.527...
融资杠杆误区:满仓加杠杆不对,... 融资杠杆作为资本市场中通过借入资金放大投资规模的工具,其核心是借助信用机制扩大交易筹码,在提升资金使...
“反内卷”的风吹到了惠民保 记者 姜鑫 7月31日晚,国家金融监督管理总局办公厅发布了《关于推动城市商业医疗险高质量发展的通知》...
酒类即时零售调查:市场规模突破... 出品|搜狐财经 作者|饶婷 编辑|李文贤 【编者按】当数字浪潮席卷消费市场,酒业的 “触网” 之路早...
股票行情快报:赫美集团(002... 证券之星消息,截至2025年8月1日收盘,赫美集团(002356)报收于3.2元,上涨0.31%,换...
刘庆峰说马斯克不懂AI:科大讯... 文:互联网江湖 刘致呈 敢直言马斯克不懂AI的人,出现了。 最近,科大讯飞董事长刘庆峰在与正和岛总...
国债等利息收入增值税恢复征收,... 界面新闻记者 | 杨志锦 界面新闻编辑 | 王姝 财政部、税务总局8月1日发布公告称,自2025...
历史重演?美国7月非农暴雷,美... 来源:第一财经 作为本周最受关注的数据,美国7月非农就业报告意外不及预期,加之此前两个月数据大幅下修...
8月8日起,新发行国债等债券的... 两部门发文恢复征收国债、地方债、金融债券利息收入增值税 财政部、国家税务总局1日联合对外发布公告称,...
首个旧改做地转化宅地 广州市客... 观点网7月31日,广州越秀区挂牌市客运站商住地块,计划于9月1日10时竞价。 该地块位于环市路以南,...
就业引擎熄火,美联储还能“稳住... 来源:市场资讯 来源:汇通网 汇通财经APP讯——7月美国非农就业数据大幅低于预期,仅新增7.3万个...
【公告精选】601088,筹划... 中国神华:筹划发行股份及支付现金购买资产并募集配套资金 股票8月4日起停牌 九号公司:上半年净利12...
原创 一... “老铁们,这周行情像不像坐过山车?指数蔫了吧唧,个股却玩起高空蹦极!南新制药一周暴涨78%,市值差点...
星巴克中国业务竞购名单曝光!腾... 《科创板日报》8月1日讯(记者 徐赐豪),星巴克中国业务的未来发展又有了新变数。 据报道,有知情人士...
带娃去四川三天两夜旅游攻略!成... 我一直梦想着带家人来一场说走就走的旅行,而四川,这个充满魅力的地方,就成了我们的首选。四川不仅有壮丽...
江苏银行:截至目前绿色融资余额... 8月1日,上证报记者从江苏银行获悉,截至目前,该行绿色融资余额已突破7000亿元,服务绿色企业超12...