牛马辅助网_全网最大游戏辅助资源网_678辅助网_我爱辅助
牛蛙资源网-只为资源而生,分享永无止境,牛蛙网

android启动模式和应用场景(android 设计模式)

小编 值得一看
扫码手机访问扫码手机访问
0

自定义模式和普通模式的区别,android中设计模式的运用

什么是组合模式?以及组合模式代码示例

Java组合模式是一种设计模式,它将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,可以将它们看作是同一种对象。

在Android开发中,组合模式可以用于构建复杂的UI层次结构。例如,在一个应用中可能有多个Activity,每个Activity都包含多个Fragment,而每个Fragment又可能包含多个View。这种层次结构可以使用组合模式来构建。

让我们看一个简单的例子来说明Java组合模式的实现和应用。假设我们要设计一个文件系统,其中有文件夹和文件两种类型的对象。文件夹可以包含多个文件夹和文件,而文件不能包含其他对象。我们可以使用组合模式来实现这个文件系统。

首先,我们定义一个抽象类FileSystemObject,它有两个子类:Folder和File。Folder可以包含多个FileSystemObject,而File没有任何子对象。

abstract class FileSystemObject { protected String name public FileSystemObject(String name) { this.name = name } public abstract void print()}class Folder extends FileSystemObject { private List children public Folder(String name) { super(name) children = new ArrayList() } public void add(FileSystemObject child) { children.add(child) } public void remove(FileSystemObject child) { children.remove(child) } public void print() { System.out.println("Folder: " + name) for (FileSystemObject child : children) { child.print() } }}class File extends FileSystemObject { public File(String name) { super(name) } public void print() { System.out.println("File: " + name) }}

在上面的代码中,FileSystemObject是抽象类,包含一个name属性和一个print() *** 。Folder类维护了一个List类型的children属性,可以添加和删除FileSystemObject对象,并重写了print() *** 以打印文件夹中包含的所有子对象。File类没有任何子对象,所以它只需要实现print() *** 即可。

接下来,我们可以使用组合模式来创建一个文件系统。例如,我们可以创建一个文件夹root,其中包含两个子文件夹folder1和folder2,以及两个文件file1和file2。代码如下:

Folder root = new Folder("root")Folder folder1 = new Folder("folder1")Folder folder2 = new Folder("folder2")File file1 = new File("file1")File file2 = new File("file2")root.add(folder1)root.add(folder2)root.add(file1)folder1.add(file2)root.print()

输出结果如下:

Folder: rootFolder: folder1File: file2Folder: folder2File: file1

这个例子中,我们使用了Java组合模式来构建一个文件系统,其中Folder和File都是FileSystemObject的子类,可以进行嵌套组合。我们可以将这种结构应用到Android开发中,以构建复杂的UI层次结构。例如,在一个应用中,我们可以使用组合模式来构建UI视图的层次结构,其中每个视图都可以包含多个子视图。下面我们来看一个在Android开发中使用组合模式的例子。

假设我们要构建一个类似于通讯录的应用,其中包含多个联系人列表,每个联系人列表又包含多个联系人项。我们可以使用组合模式来实现这个应用的UI层次结构。具体地,我们可以定义一个ContactList类来表示联系人列表,它包含多个ContactItem对象,而每个ContactItem对象又包含多个UI视图,如姓名、 *** 号码等。

首先,我们定义一个CompositeView抽象类来表示UI层次结构中的组合对象。它包含一个addChild() *** 和一个removeChild() *** 来添加和删除子视图。它还包含一个getChild() *** ,用于获取子视图。最后,它还包含一个抽象 *** draw(),表示绘制UI视图。

abstract class CompositeView { protected List children public CompositeView() { children = new ArrayList() } public void addChild(CompositeView view) { children.add(view) } public void removeChild(CompositeView view) { children.remove(view) } public CompositeView getChild(int index) { return children.get(index) } public abstract void draw()}

接下来,我们可以定义ContactList和ContactItem类来表示通讯录应用中的联系人列表和联系人项。

class ContactList extends CompositeView { @Override public void draw() { System.out.println("Drawing ContactList") for (CompositeView view : children) { view.draw() } }}class ContactItem extends CompositeView { private String name private String phoneNumber public ContactItem(String name, String phoneNumber) { this.name = name this.phoneNumber = phoneNumber } @Override public void draw() { System.out.println("Drawing ContactItem: " + name + ", " + phoneNumber) for (CompositeView view : children) { view.draw() } }}

在上面的代码中,ContactList类和ContactItem类都继承自CompositeView类,并实现了draw() *** 来绘制UI视图。ContactList类重写了draw() *** 来绘制联系人列表,其中遍历了所有子视图,并调用每个子视图的draw() *** 来绘制。ContactItem类包含了联系人的姓名和 *** 号码,并重写了draw() *** 以打印这些信息。

我们可以使用组合模式来创建一个通讯录应用。例如,我们可以创建一个ContactList对象并向它添加多个ContactItem对象,如下所示:

ContactList contactList = new ContactList()ContactItem contactItem1 = new ContactItem("Alice", "123-456-7890")ContactItem contactItem2 = new ContactItem("Bob", "234-567-8901")ContactItem contactItem3 = new ContactItem("Charlie", "345-678-9012")contactList.addChild(contactItem1)contactList.addChild(contactItem2)contactList.addChild(contactItem3)

最后,我们可以调用ContactList对象的draw() *** 来绘制整个通讯录应用的UI视图。

contactList.draw()

在Android开发中,组合模式常常被用于构建复杂的UI层次结构。例如,我们可以使用组合模式来构建一个树形结构的UI视图,其中每个节点都可以包含多个子节点。这种结构可以应用于许多应用程序,如文件浏览器、电子邮件客户端等。下面是一个在Android开发中使用组合模式的示例。

在Android开发中,我们通常使用ViewGroup类来表示UI层次结构中的组合对象,它包含多个子视图。ViewGroup类是所有布局类的基类,它包含了一些常用的布局属性,如layout_width、layout_height等。我们可以继承ViewGroup类来创建自定义的布局,并使用组合模式来构建复杂的UI层次结构。

下面是一个简单的自定义布局类TreeNodeLayout,它继承自ViewGroup类,并用于绘制树形结构中的节点。

public class TreeNodeLayout extends ViewGroup { private int mHorizontalSpacing private int mVerticalSpacing public TreeNodeLayout(Context context) { super(context) mHorizontalSpacing = 10 mVerticalSpacing = 10 } public TreeNodeLayout(Context context, AttributeSet attrs) { super(context, attrs) mHorizontalSpacing = 10 mVerticalSpacing = 10 } public void setHorizontalSpacing(int spacing) { mHorizontalSpacing = spacing } public void setVerticalSpacing(int spacing) { mVerticalSpacing = spacing } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int x = mHorizontalSpacing int y = mVerticalSpacing int maxHeight = 0 for (int i = 0 i < getChildCount(); i++) { View child = getChildAt(i); if (x + child.getMeasuredWidth() > r) { x = mHorizontalSpacing y += maxHeight + mVerticalSpacing maxHeight = 0 } child.layout(x, y, x + child.getMeasuredWidth(), y + child.getMeasuredHeight()) if (child.getMeasuredHeight() > maxHeight) { maxHeight = child.getMeasuredHeight() } x += child.getMeasuredWidth() + mHorizontalSpacing } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int maxWidth = MeasureSpec.getSize(widthMeasureSpec) int x = mHorizontalSpacing int y = mVerticalSpacing int maxHeight = 0 int totalWidth = 0 for (int i = 0 i < getChildCount(); i++) { View child = getChildAt(i); measureChild(child, widthMeasureSpec, heightMeasureSpec); if (x + child.getMeasuredWidth() > maxWidth) { x = mHorizontalSpacing y += maxHeight + mVerticalSpacing maxHeight = 0 } if (i == 0 || x == mHorizontalSpacing) { totalWidth = x + child.getMeasuredWidth() + mHorizontalSpacing } if (child.getMeasuredHeight() > maxHeight) { maxHeight = child.getMeasuredHeight() } x += child.getMeasuredWidth() + mHorizontalSpacing } setMeasuredDimension(resolveSize(totalWidth, widthMeasureSpec), resolveSize(y + maxHeight + mVerticalSpacing, heightMeasureSpec))}}

`TreeNodeLayout`类继承自`ViewGroup`类,它包含了两个私有变量`mHorizontalSpacing`和`mVerticalSpacing`,用于控制子节点之间的水平和垂直间距。它还覆盖了`onLayout()`和`onMeasure()` *** ,用于计算子节点的位置和尺寸,并绘制整个UI视图。 在这个示例中,我们使用了组合模式来构建树形结构的UI视图。每个节点都表示为一个`TreeNodeLayout`对象,它可以包含多个子节点。当我们向`TreeNodeLayout`对象添加子节点时,它会自动适应子节点的尺寸和位置,从而形成一个完整的树形结构。 下面是一个使用`TreeNodeLayout`类构建树形结构的示例代码:

public class TreeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_tree) TreeNodeLayout rootNode = findViewById(R.id.root_node) rootNode.setHorizontalSpacing(30) rootNode.setVerticalSpacing(30) TreeNodeLayout node1 = new TreeNodeLayout(this) node1.setBackgroundColor(Color.RED) node1.setLayoutParams(new ViewGroup.LayoutParams(200, 200)) TreeNodeLayout node2 = new TreeNodeLayout(this) node2.setBackgroundColor(Color.BLUE) node2.setLayoutParams(new ViewGroup.LayoutParams(200, 200)) TreeNodeLayout node3 = new TreeNodeLayout(this) node3.setBackgroundColor(Color.GREEN) node3.setLayoutParams(new ViewGroup.LayoutParams(200, 200)) rootNode.addView(node1) rootNode.addView(node2) rootNode.addView(node3) TreeNodeLayout node4 = new TreeNodeLayout(this) node4.setBackgroundColor(Color.YELLOW) node4.setLayoutParams(new ViewGroup.LayoutParams(100, 100)) TreeNodeLayout node5 = new TreeNodeLayout(this) node5.setBackgroundColor(Color.CYAN) node5.setLayoutParams(new ViewGroup.LayoutParams(100, 100)) node1.addView(node4) node1.addView(node5) TreeNodeLayout node6 = new TreeNodeLayout(this) node6.setBackgroundColor(Color.MAGENTA) node6.setLayoutParams(new ViewGroup.LayoutParams(150, 150)) node2.addView(node6) }}

在这个示例中,我们首先在布局文件中定义了一个TreeNodeLayout对象rootNode,用于表示树形结构的根节点。然后,我们创建了三个子节点node1、node2和node3,并将它们添加到rootNode中。接着,我们又创建了两个子节点node4和node5,并将它们添加到node1中。最后,我们又创建了一个子节点node6,并将它添加到node2`中。这样,就形成了一个包含六个节点的树形结构。

在这个示例中,我们通过代码动态地创建了树形结构,但实际上,我们也可以通过解析XML文件来创建树形结构。例如,我们可以将上述代码移动到一个XML文件中,并使用LayoutInflater来解析该文件,然后将根节点添加到视图层次结构中。具体实现 *** 可以参考Android官方文档。

除了树形结构之外,组合模式还可以用于构建其他复杂的UI视图,例如表格、网格、列表等。在实际开发中,我们通常会使用现成的控件库来构建这些UI视图,但了解组合模式的实现原理仍然是非常有用的,可以帮助我们更好地理解控件库的内部实现和优化。

相关源码解析

在Android源码中,组合模式的应用非常广泛,例如ViewGroup、ListView、RecyclerView等控件都使用了组合模式来构建UI视图。下面以ListView为例,简要介绍一下其内部实现。

ListView继承自AbsListView类,它是一个抽象的列表视图控件,提供了列表的基本功能,例如滚动、选中、缓存等。AbsListView类又继承自AdapterView类,它是一个抽象的适配器视图控件,提供了适配器的基本功能,例如数据绑定、视图复用等。

AdapterView类的内部实现非常简单,它只包含了一个Adapter对象,用于管理列表的数据和视图。Adapter对象是一个抽象类,它提供了许多 *** ,用于获取列表的数据、视图类型、视图尺寸等。具体实现由子类来完成,例如ArrayAdapter、CursorAdapter、SimpleAdapter等。

在ListView控件中,我们可以通过setAdapter() *** 来设置适配器对象,从而实现数据的绑定和视图的构建。ListView会先调用适配器的getCount() *** ,获取列表项的总数,然后根据列表项的总数,动态创建对应数量的View对象,并调用适配器的getView() *** ,将数据绑定到View上。为了提高性能,ListView还使用了视图复用机制,即当一个View滚出屏幕时,不销毁它,而是将它放入一个可重用的池中,待需要时再从池中取出进行重用。这样可以避免频繁地创建和销毁View对象,提高了列表的滚动性能和内存使用效率。

在ListView控件中,每个列表项都是一个View对象,这些View对象又可以包含其他的View对象,形成了一个嵌套的视图层次结构。这正是组合模式的典型应用场景,ListView通过组合模式将多个View对象组合成一个复杂的UI视图。

以下是ListView控件的简化示意图,用于说明其内部结构:

ListView├── HeaderView1├── HeaderView2├── ItemView1├── ItemView2│ ├── SubItemView1│ └── SubItemView2├── ItemView3├── ItemView4│ ├── SubItemView3│ ├── SubItemView4│ └── SubItemView5├── ...└── FooterView1

在这个示意图中,我们可以看到ListView包含了多个View对象,其中HeaderView和FooterView是作为固定位置的视图,而ItemView和SubItemView则是根据数据动态生成的视图。这些视图对象都是View类的子类,可以通过组合模式进行灵活的组合和嵌套。

在ListView控件中,每个View对象都有一个唯一的标识符position,用于指示该视图在列表中的位置。ListView通过Adapter对象来管理视图和数据的对应关系,将视图的标识符和对应的数据项进行映射。当滚动列表时,ListView会根据当前可见区域内的视图位置,从适配器中获取对应的数据项,并将数据项绑定到对应的视图上。这样,就实现了数据和视图的动态绑定,使得列表的数据可以随时更新,同时又能保持较高的性能和内存使用效率。

除了ListView控件之外,Android中还有许多其他的控件和框架也使用了组合模式,例如RecyclerView、Fragment、ViewStub等。了解这些控件和框架的内部实现,有助于我们更好地理解Android的UI架构和设计思想,提高开发效率和代码质量。

结论

组合模式是一种常用的设计模式,用于将多个对象组合成一个复杂的对象结构,并且可以像单个对象一样进行访问和操作。在Android开发中,组合模式被广泛应用于UI视图的构建和管理,例如ListView、RecyclerView、Fragment等控件和框架都使用了组合模式。

android常用设计模式和场景,android 设计模式


免责声明:

本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail: 335278579@qq.com

我来说两句
签到
热门文章
随机推荐