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 中的许多常用设计模式。

相关内容

热门资讯

不良率上升倒逼防线前移 银行收... 银行正在给个人信贷风控“上强度”。上海证券报记者近期自业内多方了解到,不少银行零售信贷业务从审批权限...
自媒体新手如何快速涨粉?这5个... 自媒体新手如何快速涨粉?这5个技巧让你少走弯路! 嗨,我是小融。 最近很多刚入门自媒体的朋友问我,怎...
乌兰察布市财政局关于黄金领域非... 乌兰察布市财政局关于黄金领域 非法金融活动风险提示 近期,黄金价格波动频繁,市场热度持续攀升,各类假...
一只鸡蛋架“直发”俄罗斯 无锡... (来源:无锡新传媒) 转自:无锡新传媒 一只3D打印塑料鸡蛋架,成为无锡国际邮件互换局正式开通运营后...
武汉楼市开启红五月 新房成交量... 原标题:武汉楼市开启红五月 数据爆表,新房成交量较去年同期翻番 武汉城建未来中心项目营销中心现场来...
一家精神病院竟现身A股公司前十... 5月8日,有投资者发现,盛通股份前十大股东名单中,竟出现了一家精神病院的身影。这家精神病院全称为“上...
真的老了!哈登心魔难除 骑士还... 哈登又拉胯了。 刚刚过去的两场东部半决赛,骑士都输的相当狼狈,而哈登的发挥更是灾难级的。 半决赛G1...
精神病院通报成上市公司前十大股... 近日,上市公司盛通股份发布一季报,披露了前十大股东名单。其中,一家名为“上饶市广丰区十五岭山精神病医...
天溯计量发布年报 上市首年检测... 转自:中国经营网 文 近日,计量检测机构天溯计量(301449.SZ)发布了2025年年度报告。年...
原创 全... 美伊真要停火了? 一页纸协议让全球油价闪崩! 就在今天,全球市场被一条消息炸开了锅。美国白宫觉得,他...
百信银行业绩:26Q1净利润大... 4月底,中信百信银行股份有限公司(下称“百信银行”)2025年财报及2026年一季度报接连披露—— ...
美光科技股价单周飙升38% 市... 【CNMO科技消息】受全球内存芯片短缺影响,美光科技股价本周大幅上涨。截至周五收盘,美光股价报746...
江西一精神病院炒股,炒成上市公... 近日,上市公司盛通股份(002599.SZ)发布一季报,披露了前十大股东名单,其中一家名为“上饶市广...
专访中国太保副总裁俞斌:从“+... 拥抱AI(人工智能),不再是保险行业的“选择题”,而是关乎企业生存与发展的“必答题”,更是企业决胜未...
多平台优化算法:美团取消超时扣... 图片来源:界面图库 5月8日,网信中国发布消息称,生活服务类平台算法治理已取得初步成效,美团、淘宝、...
原创 2... 2025年,国内系统重要性银行名单正式公布。这是我国金融体系的核心支柱,一共21家银行入选,它们是维...
东海县供销总社:“供销+龙头企... 近日,东海县供销合作总社鼎味泰直营店正式开业。作为东海县供销系统打造的新型社企便民服务网点,该门店的...
原创 阿... 深夜,一家零食店铺的客服后台弹出一条消息:“我上次买的芒果干,这次想换个不那么酸的口味,再帮我推荐几...
和平湾全新项目前瞻 负公摊、唯... 在沈阳,如果想在主城核心区域找一块容积率低于1.5的住宅用地,难度有多大? 过去三年,沈阳主城核心区...
精神病院与国际投行高盛同在 盛... 近日,盛通股份(002599.SZ)发布一季报,其前十大股东名单中,第九位为“上饶市广丰区十五岭山精...