Android Design
Pattern
Lucas Xu
1
In a nutshell
 MVC
 MVVM
 Observer
 Adapter
 Façade
 Bridge
 Factory
 Template
 Composition
 Decorator
2
MVC
 Model: data
 View: UI
 Controller: Logic
3
MVC - View
 res/layout/main.xml
http://developer.android.com/resources/tutorials/views/hello-gridview.html
<?xml version="1.0" encoding="utf-8"?>
<GridView
xmlns:android="http://schemas.android.com/apk/
res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
4
MVC - Controller
http://developer.android.com/resources/tutorials/views/hello-listview.html
 HelloGridView.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
Toast.makeText(HelloGridView.this, "" + position,
Toast.LENGTH_SHORT).show();
}
});
}
5
MVC - Model
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the
Adapter
public View getView(int position, View convertView,
ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled,
initialize some attributes
imageView = new ImageView(mContext);
6
MVC: all in one
 ListActiviy
Ref:
http://www.ideasandroid.com/archives/295
http://developer.android.com/reference/android/app/ListActivity.html
7
 Exercise
 Write your custom GridActivity
Variant – MVVM
Model View ViewModel
8
Ref:
http://en.wikipedia.org/wiki/Model_View_ViewModel
http://www.codeproject.com/KB/android/androidbinding.aspx
Android Binding
MVVM (cont’d)
 public static interfaceSimpleCursorAdapter
 bindView(View view, Context context, Cursor
cursor)
 ViewBinder
 setViewValue(View view, Object data, String
textRepresentation)
9
Ref:
http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
Observer
 BroadCastReciever
 Sensor Listener
 OnClickListener
 onClick
 OnCreateMenuListener
 onCreateContextMenu
 AsyncTask
 onProgressUpdate, onPostExecute
 Activity lifecycle callbacks (onStart, onResume, etc.) although with
only one dedicated subscriber.
 ?Many observerables support only one observer, how to extend?
 View.setOnClickListener(new OnClickListener())…
10
Observer (cont’d)
 Handler
 handleMessage()
 sendMessage()
 Single thread model v.s. Multiple thread
model
 Update UI in UI thread
 Looper, Handler , MessageQueue
 Kill Thread
11
Observer (cont’d)
 UI Sync:
 ES 文件浏览器
 ListView, GridView, etc,
 Delete, add, rename file .
 App alliance
 App downloading
 Downloading cancelled/ failed
 App installed
12
Adapter
 View
 AdapterView
 ExpandableListView
 Gallery
 GridView
 ListView
 Spinner
13
Data
Adapter
View
ListView
GridView
CustomView
Data Source
Content Provider
SharedPreference
Resources
SQLite
File System
public interfaceAdapter
abstract int getCount()
abstract Object getItem(int position)
abstract long getItemId(int position)
abstract int getItemViewType(int position)
abstract View getView(int
position, View convertView, ViewGroup parent)
abstract int getViewTypeCount()
abstract boolean hasStableIds()
abstract boolean isEmpty()
abstract void registerDataSetObserver(DataSetObserver observer)
abstract void unregisterDataSetObserver(DataSetObserver observer)
14
Adapter (cont’)
 ArrayAdapter<T>
 BaseAdapter
 CursorAdapter
 HeaderViewListAdapter
 ListAdapter
 ResourceCursorAdapter
 SimpleAdapter
 SimpleCursorAdapter
 SpinnerAdapter
 WrapperListAdapter
Façade
 A facade is an object that provides a
simplified interface to a larger body of
code, such as a class library.
 wrap a poorly-designed collection of APIs
with a single well-designed API (as per task
needs).
 Hide Complexity
 App network
 ExchangeViewManager
15
Façade (cont’d)
Android Media Framework
16
Bridge
 "decouple an abstraction from
its implementation so that the two can
vary independently“
17
Adapter
CursorAdapter
SimpleCursorAdapter
ArrayAdapter
AdapterView
AdapterViewFlipper
ExpandableListView
Gallery
Factory Method
 Defer instantiation to subclasses
18
View
Activity
ListView
OnCreate()
ListActivity
OnCreate()
...
View= FactoryMethod()
...
return new ListView
Factory Method (cont’d)
 View.
 protected Dialog onCreateDialog(int id)
Builder
 AlertDialog.Builder builder = new
AlertDialog.Builder(this);
19
Template
 Activity
 onCreate()
 AsyncTask
 doInBackground()
20
Composition
 Group sub objects, treated as a single
instance
 View, View Group, etc.
21
Composition (cont’d)
 View
 ViewGroup
 ? Why does ViewGroup subclass View,
what pattern is used?
 ?交换的小把手有很多样式,用哪种设计模式?
22
public abstract class ViewGroup extends View implements ViewParent{
private View[] mChildren;
…
}
Reference:
GOF: Design Pattern, chap 2
23
http://www.adakoda.com/adakoda/2010/01/20/ASPH_AW_REV1.pdf
Decorator
 java.io.BufferedInputStream(InputStream)
 java.io.DataInputStream(InputStream)
 java.io.BufferedOutputStream(OutputStre
am)
 java.util.zip.ZipOutputStream(OutputStrea
m)
24
25

android design pattern

  • 1.
  • 2.
    In a nutshell MVC  MVVM  Observer  Adapter  Façade  Bridge  Factory  Template  Composition  Decorator 2
  • 3.
    MVC  Model: data View: UI  Controller: Logic 3
  • 4.
    MVC - View res/layout/main.xml http://developer.android.com/resources/tutorials/views/hello-gridview.html <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/ res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnWidth="90dp" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:stretchMode="columnWidth" android:gravity="center" /> 4
  • 5.
    MVC - Controller http://developer.android.com/resources/tutorials/views/hello-listview.html HelloGridView.java public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); GridView gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(new ImageAdapter(this)); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show(); } }); } 5
  • 6.
    MVC - Model publicclass ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context c) { mContext = c; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // if it's not recycled, initialize some attributes imageView = new ImageView(mContext); 6
  • 7.
    MVC: all inone  ListActiviy Ref: http://www.ideasandroid.com/archives/295 http://developer.android.com/reference/android/app/ListActivity.html 7  Exercise  Write your custom GridActivity
  • 8.
    Variant – MVVM ModelView ViewModel 8 Ref: http://en.wikipedia.org/wiki/Model_View_ViewModel http://www.codeproject.com/KB/android/androidbinding.aspx Android Binding
  • 9.
    MVVM (cont’d)  publicstatic interfaceSimpleCursorAdapter  bindView(View view, Context context, Cursor cursor)  ViewBinder  setViewValue(View view, Object data, String textRepresentation) 9 Ref: http://developer.android.com/reference/android/widget/SimpleCursorAdapter.ViewBinder.html
  • 10.
    Observer  BroadCastReciever  SensorListener  OnClickListener  onClick  OnCreateMenuListener  onCreateContextMenu  AsyncTask  onProgressUpdate, onPostExecute  Activity lifecycle callbacks (onStart, onResume, etc.) although with only one dedicated subscriber.  ?Many observerables support only one observer, how to extend?  View.setOnClickListener(new OnClickListener())… 10
  • 11.
    Observer (cont’d)  Handler handleMessage()  sendMessage()  Single thread model v.s. Multiple thread model  Update UI in UI thread  Looper, Handler , MessageQueue  Kill Thread 11
  • 12.
    Observer (cont’d)  UISync:  ES 文件浏览器  ListView, GridView, etc,  Delete, add, rename file .  App alliance  App downloading  Downloading cancelled/ failed  App installed 12
  • 13.
    Adapter  View  AdapterView ExpandableListView  Gallery  GridView  ListView  Spinner 13 Data Adapter View ListView GridView CustomView Data Source Content Provider SharedPreference Resources SQLite File System
  • 14.
    public interfaceAdapter abstract intgetCount() abstract Object getItem(int position) abstract long getItemId(int position) abstract int getItemViewType(int position) abstract View getView(int position, View convertView, ViewGroup parent) abstract int getViewTypeCount() abstract boolean hasStableIds() abstract boolean isEmpty() abstract void registerDataSetObserver(DataSetObserver observer) abstract void unregisterDataSetObserver(DataSetObserver observer) 14 Adapter (cont’)  ArrayAdapter<T>  BaseAdapter  CursorAdapter  HeaderViewListAdapter  ListAdapter  ResourceCursorAdapter  SimpleAdapter  SimpleCursorAdapter  SpinnerAdapter  WrapperListAdapter
  • 15.
    Façade  A facadeis an object that provides a simplified interface to a larger body of code, such as a class library.  wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).  Hide Complexity  App network  ExchangeViewManager 15
  • 16.
  • 17.
    Bridge  "decouple anabstraction from its implementation so that the two can vary independently“ 17 Adapter CursorAdapter SimpleCursorAdapter ArrayAdapter AdapterView AdapterViewFlipper ExpandableListView Gallery
  • 18.
    Factory Method  Deferinstantiation to subclasses 18 View Activity ListView OnCreate() ListActivity OnCreate() ... View= FactoryMethod() ... return new ListView
  • 19.
    Factory Method (cont’d) View.  protected Dialog onCreateDialog(int id) Builder  AlertDialog.Builder builder = new AlertDialog.Builder(this); 19
  • 20.
    Template  Activity  onCreate() AsyncTask  doInBackground() 20
  • 21.
    Composition  Group subobjects, treated as a single instance  View, View Group, etc. 21
  • 22.
    Composition (cont’d)  View ViewGroup  ? Why does ViewGroup subclass View, what pattern is used?  ?交换的小把手有很多样式,用哪种设计模式? 22 public abstract class ViewGroup extends View implements ViewParent{ private View[] mChildren; … } Reference: GOF: Design Pattern, chap 2
  • 23.
  • 24.
    Decorator  java.io.BufferedInputStream(InputStream)  java.io.DataInputStream(InputStream) java.io.BufferedOutputStream(OutputStre am)  java.util.zip.ZipOutputStream(OutputStrea m) 24
  • 25.