我正在对各种平台的设计模式进行小型研究,并且我之前有使用 Java 进行编程的经验。
阅读这些帖子时:MVC pattern on Android和 MVC architecture in Android ,
我想到了一个有趣的问题:为什么Java swing MVC 不能与Android 开发模式相提并论?或者为什么我们不能说 Android 遵循 MVC? (在整体“外观和感觉”的背景下)。
在一个回答中,有人将 MVC 解释为:
模型:渲染什么
View :如何渲染
Controller :事件、用户输入
好的。好吧,现在我的理解是:
在Java swing MVC中,component类是所有组件的抽象类
视觉环境中的属性。有一个独特的关键字叫做
controls 用于某些组件,例如按钮、列表等。
因此,所有控件和组件都是 MVC 中模型的一部分。
Container继承component。并且有几个
LayoutManagers 定义 components 的布局和位置
容器。还有 Listeners 必须注册
根据 EventSources。所以,它们都是 MVC 中的View。
实现 Listener 接口(interface)方法 的类,我们将 main
逻辑,每个事件都有一些 EventClasses。他们都是
MVC 中 Controller 的一部分。
将所有这些示例放在一张图片中;在 swing MVC 中,我们有:
我认为 widgets 与此处的 controls 相同。另外,还有一些
其他 EventSources。它们都充当一个模型。
View 包有 viewgroups(也包含几种
layouts.) 和 Listener interfaces。他们都是的一部分
在 MVC 中查看。
与 swing MVC 相同,我们可以说 Listener 接口(interface)方法 和 Activity 是
Controller 的部分。
将所有内容放在一起;在 Android 中,我们有:
根据以上比较,我认为有以下相似之处:
容器 - 与 View
布局管理器 - 与 ViewGroup
Listeners - 两种架构总体相同
controls - 总体上与 widgets
事件委托(delegate)(向事件源注册适当的监听器,然后实现监听器的方法)——两种架构总体相同
那么,谁能解释一下是什么让 Android 设计模式不同于 Java swing MVC 模式?
或者如果您认为两者是不同的东西(在用于开发的设计模式的上下文中),请解释为什么?
最佳答案
每个 Swing JComponent 都有 ComponentUI负责显示一个组件。虽然 JComponent 有一个 paint 方法,但只有用户派生类直接使用它 - “标准”实现通常只是 call the paint method而不是附加的用户界面。这允许非常容易地插入各种外观实现 - 不同的外观只是提供不同的 ComponentUI。很明显,组件是“模型”,UI 是“ View ”。 Android 并没有以非常明显的方式继承这种解耦。例如,它的 TextView 似乎只是 painting drawables当类似的 JLabel 有 UI .
然而,这并不是唯一使用 MVC 方法的地方,对于其他一些特定情况,Android 和 Swing MVC 非常相似。例如,Android ListView 有一个模型 (ListAdapter),就像 Swing JList 有 ListModel 一样。在这两种情况下,模型提供数据,而组件本身提供显示的可能性。可能的区别在于 Swing 具有更多具有这种解耦数据和表示的组件。 JTable 和 JTree 在 Android 不提供开箱即用的此类组件时具有相似的模型。根本没有树,而且TableLayout是一个叫做 GridLayout 的在 Swing 中,与 JTable 不同。
失效和重绘的一般方法没有太大区别,在这两个框架中,只有专用的主线程才能接触组件。此外,Java 和 Android 中的事件监听器(可能是其他“ Controller ”组)非常相似,它们之间的所有差异可能只能称为“微妙”。
容器和布局管理在 Swing 和 Android 之间也非常相似,主要区别在于 Swing 对其 LayoutManager 有更多可能的实现。比安卓有更多选择 ViewGroup (像 DatePicker 这样的类虽然派生自 ViewGroup,但不是通用布局管理器)。此外,Android 布局的一部分是用 XML 编码的,而 Swing 通常只是普通的 Java。如果布局管理器也是响应调整大小或重新定向等事件的“ Controller ”,那么这部分的完成方式非常相似。但是我不确定布局管理器是否真的是“ Controller ”,因为它们更新的 View 多于模型。
一般来说,Swing 似乎更适合显示在大屏幕上的大型复杂 GUI,而 Android 更适合只有几个可见组件的小屏幕,大到足以用手指操作而无需手写笔。
关于java - Java swing MVC 与 Android 设计模式的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465320/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht