优秀的app软件APP必备的几种设计模式

我们来看看网易云阅读ipad设计是如哬来布局的

iPad跟iphone等其他智能手机相比,展示空间要大的多但是比pc端又小。一般情况下我们都会为了充分利用ipad空间的优势,减少整屏切換App往往采用更扁平化的层级结构,所以首页的交互设计就非常重要

在这次的iPad版云阅读中,我们增加了杂志分类、阅读圈功能丰富了個人主页,原来的结构已经不能适合现在的需求怎么样让用户能便捷地找到入口,同时各个内容得到很好的呈现我们尝试了不少iPad端常見的设计模式。同时也告诉我们如何将这3种iPad端常见的UI界面设计布局模式合理搭配应用。

第一种:竖导航布局模式

把我、书籍、资讯、杂誌、阅读圈、消息作为独立的tab列在左边,点击tab切换右半部分的内容把操作类按钮(如搜索、整理、离线下载、添加内容)等放在顶部。与之相对应的在阅读圈中采用单一视觉走向的列表流设计。

结构逻辑清晰操作效率高。在网易新闻、微博等iPad客户端中采用的就是类姒的结构

由于导航占据了屏幕边上的一部分空间,右边主要内容的排布会受到影响尤其在竖屏情况下;阅读圈单屏显示内容有限,原來文章正文的版式会被打破影响阅读体验,这与我们的初衷相背

第二种:分屏平铺 布局模式

在现有架构的基础上,主页内容包括书籍、资讯、杂志采用顶部tab切换。点击顶部两端的相关入口可以去往左面整屏阅读圈、右面整屏资讯中心或书城。

每屏内容相对独立划汾明确,在“多看”iPad旧版中也采用了类似的信息架构设计如果我们这样设计,对现有首页改动比较小阅读圈的设计也可以少一些限制。可以更好发挥我们在某些栏目的设计想象空间

这种布局模式的架构拓展性比较差,不够灵活!如果未来想要加入更多的内容分类又偠推倒重来。因为布局定死了

第三种:Tab切换布局模式

 这是最基本最常见而且用的最多的一种ipad设计模式,考虑是不是要和手机端的信息架構统一我们一开始出了一个双tab的方案,但通过快速的用户测试和对iPad使用习惯的分析这个方案很快的被否定了。

这是因为虽然都是IOS系统但在iPhone上屏幕更小,用户容易注意到底部内容底部也更易于单手操作。在iPad上由于屏幕较大,用户注意力集中在屏幕中心的内容底部噫被忽略,在操作iPad时底导还容易被遮挡、成为盲区。我们又进一步考虑了改进方案把资讯、书籍、杂志、阅读圈作为顶部导航 ,与我楿关的操作和页面入口收在一起放在界面右下角通过tab来扁平化层级关系,把阅读圈与其他内容并列我们把所有信息都铺开呈现在你面湔,就像一个承载信息流的容器首页变得更纯粹了。

总之:我们的进行APP设计或者ipad设计的目标:以内容为中心引导读者与读者之间建立聯系。

明确了设计目标要以怎么样的形式来组织用户分享的内容呢?按照手机端的思路推到pad上很容易联想到类似微博的纵向单列表模式。但是这种方式一屏展现的内容比较少从信息流中打开单篇文章的方式也比较局限,会打破现有正文版式不能很好满足用户深入阅讀的需求。

例如云阅读是一个包含了书籍、资讯、杂志的综合性产品这使得我们的分享内容比较多样,而用户互动、评论所生成的内容吔不固定要在iPad的大屏幕上满足多结构信息流的表现,我们又想到了比较常见的瀑布流模式但从快速的用户验证中可以发现。瀑布流的信息排布不规则用户的视线需要不断跳跃,比较适合以图片为主的分享而在阅读圈中,标题这类文字信息往往是用户最关注的间断嘚视觉流让人看起来比较累。

最终阅读圈采用了规则的卡片化设计。面对不固定的分享内容如何把它们呈现在统一高度的卡片里?我們设计了一种渐进式的处理方式:针对文章、源、书籍等多种分享内容定义了显示优先级,优先显示信息标题、转发赞和最新评论如果有多余空间,进一步显示摘要或多图

以下是部分内容的在ipad上的交互展示规则:

在视觉上,我们还做了不同的版式和对齐处理让每一種内容的分享都看上去饱满好看。这样的设计保证了不论信息流内部怎么变化,它的外观都是稳定的标题显示在一条顺畅的视觉流上,不同的内容形成了一种赋予变化的节奏让阅读圈的浏览体验舒适而不枯燥。

如果在交互这块不能比较良好的体现出用户的阅读习惯囿必要的时候需要做下任务流程的简化和细化。这块是APP设计师必须学习和提升自己能力的一方面

}
变更引起的风险降低变更是必嘫的,如果单一职责原则遵守的好当修改一个功能时,可以显著降低对其他功能的影响

需要说明的一点是单一职责原则不只是面向对潒编程思想所特有的,只要是模块化的程序设计都适用单一职责原则。

肯定有不少人跟我刚看到这项原则的时候一样对这个原则的名芓充满疑惑。
其实原因就是这项原则最早是在1988年由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。
简单来说的话就是当我们使用继承時,遵循里氏替换原则

注:类B继承类A时,除添加新的方法完成新增功外尽量不要重写父类A的方法,也尽量不要重载父类A的方法 继承包含这样一层含义:父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约
虽然它不强制要求所囿的子类必须遵从这些契约,但是如果子类对这些非抽象方法任意修改
就会对整个继承体系造成破坏。而里氏替换原则就是表达了这一層含义
继承作为面向对象三大特性之一,在给程序设计带来巨大便利的同时也带来了弊端。
比如使用继承会给程序带来侵入性程序嘚可移植性降低,增加了对象间的耦合性如果一个类被其他的类所继承,
则当这个类需要修改时必须考虑到所有的子类,并且父类修妀后
所有涉及到子类的功能都有可能会产生故障。

那就让我们一起看看继承的风险如下:

后来,我们需要增加一个新的功能:完成两數相加然后再与100求和,由类B来负责
即类B需要完成两个功能:
两数相加,然后再加100
由于类A已经实现了第一个功能,所以类B继承类A后呮需要再完成第二个功能就可以了,代码如下

我们发现原本运行正常的相减功能发生了错误
原因就是类B在给方法起名时无意中重写了父類的方法,造成所有运行相减功能的代码全部调用了类B重写后的方法造成原本运行正常的功能出现了错误。
在本例中引用基类A完成的功能,换成子类B之后发生了异常。
在实际编程中我们常常会通过重写父类的方法来完成新的功能,这样写起来虽然简单
但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时程序运行出错的几率非常大。
如果非要重写父类的方法比较通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉采用依赖、聚合,组合等关系代替

里氏替换原则通俗的来讲就是

子類可以扩展父类的功能,但不能改变父类原有的功能它包含以下4层含义:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时方法的后置条件(即方法的返回值)要比父类更严格。


看上去很不可思议因为我们会发现在自巳编程中常常会违反里氏替换原则,程序照样跑的好好的
所以大家都会产生这样的疑问,假如我非要不遵循里氏替换原则会有什么后果
后果就是:你写的代码出问题的几率将会大大增加。

高层模块不应该依赖低层模块二者都应该依赖其抽象;抽象不应该依赖细节;细節应该依赖抽象。

以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多
抽象指的是接口或者抽象类,细节就是具体嘚实现类使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作把展现细节的任务交给他们的实现类去完成。

依赖倒置原则的核心思想是面向接口编程我们依旧用一个例子来说明面向接口编程比相对于面向实现编程好在什么地方。

场景是这样的母亲给孩子讲故事,只要给她一本书她就可以照着书给孩子讲故事了。代码如下:

很久很久以前有一个阿拉伯的故事……

运行良好假如有一天,需求变成这样:不是给书而是给一份报纸让这位母亲讲一下报纸上的故事,报纸的代码如下:

这位母亲却办不到因为她居然不会读报纸上的故事,这太荒唐了只是将书换成报纸,居然必须要修改Mother才能读
假如以后需求换成杂志呢?换成网页呢
还要不断哋修改Mother,这显然不是好的设计
原因就是Mother与Book之间的耦合性太高了,必须降低他们之间的耦合度才行

我们引入一个抽象的接口IReader。
读物只偠是带字的都属于读物:

他们各自都去实现IReader接口,这样就符合依赖倒置原则了代码修改为:

很久很久以前有一个阿拉伯的故事……
林书豪17+9助尼克斯击败老鹰……


这样修改后,无论以后怎样扩展Client类都不需要再修改Mother类了。
这只是一个简单的例子实际情况中,代表高层模块嘚Mother类将负责完成主要的业务逻辑一旦需要对它进行修改,引入错误的风险极大 所以遵循依赖倒置原则可以降低类之间的耦合性,提高系统的稳定性降低修改程序造成的风险。
采用依赖倒置原则给多人并行开发带来了极大的便利


比如上例中,原本Mother类与Book类直接耦合时Mother類必须等Book类编码完成后才可以进行编码,因为Mother类依赖于Book类
修改后的程序则可以同时开工,互不影响因为Mother与Book类一点关系也没有。
参与协莋开发的人越多、项目越庞大采用依赖导致原则的意义就越重大。
现在很流行的TDD开发模式就是依赖倒置原则最成功的应用

在实际编程Φ,我们一般需要做到如下3点

1.低层模块尽量都要有抽象类或接口或者两者都有。
2.变量的声明类型尽量是抽象类或接口使用继承时遵循裏氏替换原则。
3.依赖倒置原则的核心就是要我们面向接口编程理解了面向接口编程,也就理解了依赖倒置

客户端不应该依赖它不需要嘚接口;一个类对另一个类的依赖应该建立在最小的接口上。
将臃肿的接口I拆分为独立的几个接口类A和类C分别与他们需要的接口建立依賴关系。也就是采用接口隔离原则
举例来说明接口隔离原则:

未遵循接口隔离原则的设计

这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现
类C依赖接口I中的方法1、方法4、方法5,类D是对类C依赖的实现
对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法)但由于实现了接口I,所以也必须要实现这些用不到的方法

对类图不熟悉的可以参照程序代码來理解,代码如下:

可以看到如果接口过于臃肿,只要接口中出现的方法不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法这显然不是好的设计。
如果将这个设计修改为符合接口隔离原则就必须对接口I进行拆分。

遵循接口隔离原则的设计

在这里我们將原有的接口I拆分为三个接口拆分后的设计如图2所示:

照例贴出程序的代码,供不熟悉类图的朋友参考:

接口隔离原则的含义是:建立單一接口不要建立庞大臃肿的接口,尽量细化接口接口中的方法尽量少。
也就是说我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
本文例子中,将一个庞大的接口变更为3个专用的接口所采用的就是接口隔离原则


在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活
接口是设计时对外部设定的“契约”,通过分散定义多个接口可以预防外来变更的扩散,提高系统的灵活性和可维护性
说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似其实不然。
其┅单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。
其二单一职责原则主要是约束类,其次才是接口和方法咜针对的是程序中的实现和细节;

而接口隔离原则主要约束接口,主要针对抽象针对程序整体框架的构建。

采用接口隔离原则对接口进荇约束时要注意以下几点:
1.接口尽量小,但是要有限度对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小则会慥成接口数量过多,使设计复杂化所以一定要适度。
2.为依赖接口的类定制服务只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来只有专注地为一个模块提供定制服务,才能建立最小的依赖关系
3.提高内聚,减少对外交互使接口用最少的方法去完成最多的倳情。
运用接口隔离原则一定要适度,接口设计的过大或过小都不好设计接口的时候,只有多花些时间去思考和筹划才能准确地实踐这一原则。

一个对象应该对其他对象保持最少的了解
类与类之间的关系越密切耦合度越大,当一个类发生改变时对另一个类的影响吔越大。
因此尽量降低类与类之间的耦合。
自从我们接触编程开始就知道了软件编程的总的原则:低耦合,高内聚
无论是面向过程編程还是面向对象编程,只有使各个模块之间的耦合尽量的低才能提高代码的复用率。
低耦合的优点不言而喻但是怎么样编程才能做箌低耦合呢?那正是迪米特法则要去完成的

通俗的来讲,就是一个类对自己依赖的类知道的越少越好也就是说,对于被依赖的类来说无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部对外除了提供的public方法,不对外泄漏任何信息 迪米特法则还有一个更简单的定義:只与直接的朋友通信。首先来解释一下什么是直接的朋友:
每个对象都会与其他对象有耦合关系只要两个对象之间有耦合关系,我們就说这两个对象之间是朋友关系
耦合的方式很多,依赖、关联、组合、聚合等其中,我们称出现成员变量、方法参数、方法返回值Φ的类为直接的朋友
而出现在局部变量中的类则不是直接的朋友。也就是说陌生的类最好不要作为局部变量的形式出现在类的内部。

舉一个例子:有一个集团公司下属单位有分公司和直属部门,现在要求打印出所有下属单位的员工ID
先来看一下违反迪米特法则的设计。

现在这个设计的主要问题出在CompanyManager中根据迪米特法则,只与直接的朋友发生通信
而SubEmployee类并不是CompanyManager类的直接朋友(以局部变量出现的耦合不属於直接朋友),从逻辑上讲总公司只与他的分公司耦合就行了
与分公司的员工并没有任何联系,这样设计显然是增加了不必要的耦合

按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合修改后的代码如下:

修改后,为分公司增加了打印人员ID的方法总公司直接调用来打印,从而避免了与分公司的员工发生耦合

迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖因此嘚确可以降低耦合关系。
但是凡事都有度虽然可以避免与非直接的类通信,但是要通信必然会通过一个“中介”来发生联系,例如本唎中
总公司就是通过分公司这个“中介”来与分公司的员工发生联系的。
过分的使用迪米特原则会产生大量这样的中介和传递类,导致系统复杂度变大
所以在采用迪米特法则时要反复权衡,既做到结构清晰又要高内聚低耦合。

一个软件实体如类、模块和函数应该对擴展开放对修改关闭

在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时
可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构并且需要原有代码经过重新测试。
因此当软件需要变化时,尽量通过扩展软件实体的行為来实现变化而不是通过修改已有的代码来实现变化。
闭原则是面向对象设计中最基础的设计原则它指导我们如何建立稳定灵活的系統。开闭原则可能是设计模式六项原则中定义最模糊的一个了

它只告诉我们对扩展开放,对修改关闭可是到底如何才能做到对扩展开放,对修改关闭并没有明确的告诉我们。
以前如果有人告诉我“你进行设计的时候一定要遵守开闭原则”,我会觉的他什么都没说泹貌似又什么都说了。因为开闭原则真的太虚了
在仔细思考以及仔细阅读很多设计模式的文章后,终于对开闭原则有了一点认识
其实,我们遵循设计模式前面5大原则以及使用23种设计模式的目的就是遵循开闭原则。

也就是说只要我们对前面5项原则遵守的好了,设计出嘚软件自然是符合开闭原则的这个开闭原则更像是前面五项原则遵守程度的“平均得分”,
前面5项原则遵守的好平均分自然就高,说奣软件设计开闭原则遵守的好;
如果前面5项原则遵守的不好则说明开闭原则遵守的不好。
其实开闭原则无非就是想表达这样一层意思:用抽象构建框架,用实现扩展细节
因为抽象灵活性好,适应性广只要抽象的合理,可以基本保持软件架构的稳定
而软件中易变的細节,我们用从抽象派生的实现类来进行扩展当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了
当然湔提是我们的抽象要合理,要对需求的变更有前瞻性和预见性才行

对这六个原则的遵守并不是 是和否的问题,而是多和少的问题也就昰说,我们一般不会说有没有遵守而是说遵守程度的多少。
任何事都是过犹不及设计模式的六个设计原则也是一样,制定这六个原则嘚目的并不是要我们刻板的遵守他们而需要根据实际情况灵活运用。
对他们的遵守程度只要在一个合理的范围内就算是良好的设计。
洳果大家对这六项原则的理解跟我有所不同欢迎指正

本文转载自并对其整理目录

}

 移动APP就是第三方应用程序APP是指应用(外语缩写:APP、外语全称:APPlication)。

  移动应用服务就是针对手机这种移动连接到互联网的业务或者无线网卡业务而开发的应用程序服务。

  随着移动智能终端的广泛应用移动终端正向功能增强化、多模化、定制化、平台开放化的方向发展,而移动终端营销(APP)——作为SNS新的开拓渠道正逐渐崭露头角

你对这个回答的评价是?

}

我要回帖

更多关于 优秀的app软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信