设配器模式不止是补救,有时更像是一个创造者

2024-05-10 03:08

本文主要是介绍设配器模式不止是补救,有时更像是一个创造者,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设配器模式不止是补救,有时更像是一个创造者

适配器模式的官方应用场景是在软件开发后期,应对功能扩展后,新的类结构无法对应之前的接口,从而采用的一种补救措施。然而如果你只记住了这个,你可能会错过一个很重要的技巧。

================

定义

将一个类的接口变换成客户端所期待的另一个类的接口,从而使原本因接口不匹配而无法一起工作的两个类可以匹配。

咬文嚼字

必须要承认的是适配器模式是一个非常好的补救模式。但是除了补救呢?

适配器的核心是:对象的转变,将不适配的东西转成适配的东西。

关键词:“转换”。转换 — 加工 — 创造!

没错,我要说的就是创造。适配器模式在一些特定的场合,更像一个创造者模式。什么场合呢?

Data — View

灵感来源于Android控件 ListView。

其实最早在小小白时期并不能理解ListView适配器的工作原理,甚至因为模板模式的关系,没有显示调用关系,我甚至无法理解它是如何办到的!

将一个数据集塞进适配器,再将适配器塞给ListView,数据就展示出来了.Magic!

适配器模式—创造者模式

在一些复杂的ViewItem组合的View控件里(ListView, ViewPager,GirdView),因为Item的样式常常需要我们自行通过基础View控件组合子定义,而如何将数据转变为这些ViewItem就成为了问题。难道有5个Item我就定义5个View吗?NO!!当Item变成了100个怎么办?

这里,如果你想起来了适配器模式,那问题就迎刃而解。

通过适配器模式创造View,是非常符合数据控制View这条守则的。

在适配器模式中去写View的显示逻辑,也实现了View和业务解耦的需求。

而通过Data,去控制View的显示,也极大的提高了View效率,减少了不必要的View创建。

关于代码,因为较多,我们放在最后。

适配器模式优点

  • 适配器模式可以让没有任何关系的两个类在一起运行(最明显的:Data 和 View)

  • 提高了类的复用。接口不同你不需要去修改他们为相同,只需要添加一个适配器模式。

  • 适配器模式非常符合开闭原则

  • 解耦。在Data 转View的场景里,很好的实现了View和业务逻辑的解耦。

适配器模式的缺点

适配器模式是一个非常好用的模式,几乎很难找出缺点。

可能唯一的缺点就是对小小白来说阅读代码有困难,但这点困难时非常容易跨过去的。

另外值得一提的就是需要注意的场景:

  • 书中说:适配器模式是一个不需要再设计初期就要考虑的问题。但我说,在Data — View的场景,适配器模式一定是你需要提前审查的模式,不要写了很多View觉得麻烦了才想起来适配器模式。

  • 不要滥用。并不是任何时候都适合使用适配器模式。你不会想看到你的项目里到处都是适配器的。

适配器代码

Adapter.java

public class BannerAdapter extends ScrollBannerAdapter {private List<BannerDto> mDatas;
private LayoutInflater mInflater;
private int mHeight;public BannerAdapter(Context context) {this.mInflater = LayoutInflater.from(context);mHeight = (int) context.getResources().getDimension(R.dimen.banner_width);
}public void setDatas(List datas) {mDatas = datas;
}@Override
public int getCount() {return mDatas.size();
}@Override
public Object getItem(int position) {return mDatas.get(position);
}@Override
public int getItemId(int position) {return mDatas.get(position).getId();
}@Override
public int getItemViewType(int position) {return mDatas.get(position).getType();
}@Override
public int getBannerHeight() {return mHeight;
}@Override
public View getView(int position, View convertView) {BannerDto bannerDto = mDatas.get(position);ViewHolder viewHolder = null;if (convertView == null) {viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.widget_banner, null);viewHolder.removeText = (ImageView) convertView.findViewById(R.id.removeText);viewHolder.titleText = (TextView) convertView.findViewById(R.id.titleText);viewHolder.enterText = (TextView) convertView.findViewById(R.id.enterText);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}convertView.setBackgroundColor(Color.parseColor(bannerDto.getBgColor()));viewHolder.titleText.setText(bannerDto.getTitle());return convertView;
}@Override
public View getFixView(int position, View convertView) {BannerDto bannerDto = mDatas.get(position);ViewHolder viewHolder = null;if (convertView == null) {viewHolder = new ViewHolder();convertView = mInflater.inflate(R.layout.widget_banner, null);viewHolder.removeText = (ImageView) convertView.findViewById(R.id.removeText);viewHolder.titleText = (TextView) convertView.findViewById(R.id.titleText);viewHolder.enterText = (TextView) convertView.findViewById(R.id.enterText);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.titleText.setText(bannerDto.getTitle());return convertView;
}@Override
public int setFocusable(int position) {return 0;
}@Override
public int getWheelTime(int position) {return mDatas.get(position).getWheelTime();
}@Override
public boolean isEmpty() {return mDatas.isEmpty();
}private static class ViewHolder {ImageView removeText;TextView titleText;TextView enterText;}}

View控件.java

public class ScrollBanner extends LinearLayout {//View控件其他方法//。。。//设置adapterpublic void setAdapter(ScrollBannerAdapter adapter) {this.mAdapter = adapter;mScrollBanners = new View[]{mAdapter.getView(0, null), mAdapter.getView(0, null)};}//取得下一个Viewprivate View getNextView(){if(mAdapter == null){return ;}return mAdapter.getView(mShowPosition,mScrollBannerItem);}//View控件其他方法//。。。}

这篇关于设配器模式不止是补救,有时更像是一个创造者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975260

相关文章

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》这本书里面用的并不是UML表示法。作者Martin Fowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。  有的同学会有误解,例如有同学发表以下感想: “鸦脚”表示法当然不是Fowler先使用的。F

设计模式学习之中介者模式

我们平时写代码的过程,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当地使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,本篇博客,我们就一起学习中介者模式。 定义及使用场景 定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其

设计模式学习之模版方法模式

模板方法模式是一种基于继承的代码复用的行为型模式;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。本篇博客我们一起来学习模版方法模式。 定义与UML图 定义 模板方法模式:定义一个操作

Android设计模式学习之Builder模式

Android设计模式学习之观察者模式 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。 模式的使用场景 1.相同的方法,不同的执行顺序,产生不同的事件结果时; 2.多个部件或零件,都可

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的 clone() 方法。